Vengo dalla Scala. Così ho spesso fare cose come:Metodi di concatenamento da sinistra a destra in Haskell (opposto a destra a sinistra)
println((1 to 10).filter(_ < 3).map(x => x*x))
In Haskell, dopo ho scoperto che posso liberarmi di tutte le parentesi nidificate utilizzando $
e .
, di recente ho trovato a scrivere:
putStrLn . show . map (**2) . filter (< 3) $ [1..10]
Ora, questo funziona, ma il codice si legge da destra a sinistra e, a meno che non mi sposti in arabo, per me è difficile ragionare.
C'è qualche altro trucco che mi fa incatenare le funzioni da sinistra a destra? O questo è solo il modo idiomatico di Haskell?
Si noti che 'putStrLn. mostra = stampa'. Inoltre, potresti usare 'mapM' o' forM': 'forM [x | x <- [1..10], x <3] $ stampa. (** 2) 'o qualcosa di simile. – Bakuriu
Una volta che ci si abitua, da sinistra a destra è più facile ragionare: ti dà il tipo di espressione. Nel tuo caso 'putStrnLn ... 'So che è un IO. – mb14
Osservazione non utile: il 'flusso' della normale applicazione concatenata (senza usare la composizione della funzione) è da destra a sinistra: 'f. g. h $ x = f (g (h (x))) '. Questa è una convenzione molto vecchia (e vale anche per la sintassi di tipo C, quindi non è solo un Haskellism). È la sintassi del metodo punto che è "all'indietro", non l'operatore di composizione della funzione. Nota che nell'esempio di Scala il "flusso" è molto più difficile da tracciare; in realtà inizia nel mezzo a '(1 a 10)', quindi si sposta a destra, quindi torna improvvisamente a sinistra a 'println'. – Ben