2015-01-09 9 views
6

czytam kawałek Bartosz Milewski którym definiuje on następującą funkcję:

instance Applicative Chan where 
    pure x = Chan (repeat x) 
    (Chan fs) <*> (Chan xs) = Chan (zipWith ($) fs xs) 

Dlaczego operator aplikacji funkcja w nawiasie? Rozumiem, że normalnie robi się to w celu użycia funkcji infiksowej w formie zapisu przedrostkowego, ale nie rozumiem, dlaczego w tym przypadku funkcja nie mogła być po prostu wyrażona jako Chan (zipWith $ fs xs) i zastanawiam się, jaka jest różnica między te dwie są.

(jeśli trzeba jeszcze kontekst, odnoszą się do article)

+1

byłoby prostsze, jeśli zostało zapisane jako 'Chan (zipWith id fs xs)'? Jest dokładnie taka sama jak obecna implementacja. – Carl

+0

Pamiętaj, że '($)' nie jest jakimś magicznym operatorem pierwotnym: jest to funkcja podobna do '(+)' i 'lub'. – AJFarmar

Odpowiedz

13

W tym przypadku $ jest przeszedł w do zipWith. To tak samo jak pisanie

zipWith (\ f x -> f x) fs xs 

bez nawiasów, byłoby równoznaczne z

zipWith (fs xs) 

który nie będzie typecheck.

Operator w nawiasach zachowuje się dokładnie tak, jak zwykły identyfikator. Z następującą definicję:

apply = ($) 

kod mogło wyglądać

zipWith apply fs xs 
+2

W szczególności gramatyka haskell wymaga, abyś powiedział "zipWith ", gdzie '' jest wyrażeniem. '($)' jest operatorem infiksowym '$' konwertowanym na wyrażenie *, które jest nieco inne niż "konwertowane na prefiks", i umożliwia zarówno użycie jako funkcji prefiksu, jak i użycie jako argumentu do innych funkcji. –