Ultimamente ho pensato al design delle lingue e ho letto alcune delle novità di Haskell (sempre una buona fonte di ispirazione). Sono colpito dai molti usi strani degli operatori freccia sinistra <-
e destra ->
.
Credo che i molti usi diversi provengano dalla tecnica precedente in matematica e altri linguaggi relativi alla sintassi delle frecce, ma c'è qualche altra ragione per non provare a rendere l'uso più coerente o chiaro? Forse non vedo il quadro generale?
La freccia destra viene usata come un costruttore di tipi per le funzioni, il separatore tra argomento e corpo di espressioni lambda, separatore per istruzioni case, ed è usato nelle viste pattern, che hanno la forma (e -> p)
.
La freccia sinistra viene usata in do
notation come qualcosa di simile al binding di variabili, in list comprehensions per lo stesso (presumo che siano uguali, come le list comprehensions sembrano condensate do
blocks), e in guardie del modello, che hanno la forma (p <- e)
.
Ora gli ultimi esempi per ogni freccia sono semplicemente sciocchi! Capisco che guardie e punti di vista hanno scopi diversi, ma hanno una forma quasi identica, tranne che uno è lo specchio dell'altro! Ho anche sempre trovato strano che le funzioni regolari siano definite con =
ma lambdas con ->
. Perché non usare la freccia per entrambi? O gli uguali per entrambi?
Diventa anche piuttosto strano se consideri che per confrontare un valore calcolato con una costante, ci sono quasi una mezza dozzina di modi per farlo:
test x = x == 4
f x = if test x then g x else h x
f' 4 = g 4
f' x = h x
f'' x@(test -> true) = g x
f'' _ = h x
f''' x | true <- test x = g x
| otherwise = h x
f'''' x = case (x) of
4 -> g x
_ -> h x
La varietà è lo spezia del codice sorgente, giusto?