Pochodzę ze Scala. Więc często robić rzeczy jak:Metody łączenia od lewej do prawej w Haskell (w przeciwieństwie do prawej do lewej)
println((1 to 10).filter(_ < 3).map(x => x*x))
W Haskell, po odkryłem mogę pozbyć się wszystkich zagnieżdżonych nawiasów stosując $
i .
, niedawno znalazłem się pisząc:
putStrLn . show . map (**2) . filter (< 3) $ [1..10]
Teraz, to działa, ale kod czyta od prawej do lewej i jeśli nie przejdę na język arabski, trudno mi o tym mówić.
Czy jest jakaś inna sztuczka, która sprawia, że łączę funkcje od lewej do prawej? Czy to tylko idiomatyczny sposób Haskella?
Zauważ, że 'putStrLn. show = print'. Możesz również użyć 'mapM' lub' forM': 'forM [x | x <- [1..10], x <3] $ print. (** 2) 'lub coś podobnego. – Bakuriu
Gdy już się do tego przyzwyczaisz, od lewej do prawej łatwiej się zastanowić: podaje typ wyrażenia. W twoim przypadku 'putStrnLn ...' Wiem, że to IO. – mb14
Nieprzydatna obserwacja: "przepływ" zwykłego zastosowania funkcji łańcuchowej (bez użycia składu funkcji) jest od prawej do lewej: 'f. g. h $ x = f (g (h (x))) '. Jest to bardzo stara konwencja (i zawiera nawet składnię podobną do C, więc to nie jest tylko Haskelizm). Jest to składnia metodą kropkową, która jest "wsteczna", a nie operator składu funkcji. Zauważ, że w twoim przykładzie Scala "przepływ" jest trudniejszy do prześledzenia; faktycznie zaczyna się w środku na '(1 do 10)', następnie przesuwa się w prawo, a następnie nagle przeskakuje z powrotem na lewo do 'println'. – Ben