From the chapter on Functors in Learn You a Haskell for Great Good, Lipovača stwierdza:
„Kiedy robimy
(+) <$> (+3) <*> (*100)
, robimy funkcję, która będzie używać+
na wyniki(+3)
i(*100)
i powrócić to. aby wykazać na rzeczywistym przykładzie, kiedy zrobiliśmy(+) <$> (+3) <*> (*100) $ 5
The5
pierwszy został zastosowany do(+3)
i(*100)
, w wyniku8
i500
. Następnie+
jest wywoływana z8
i500
, Res ulting w508
. "
Jednak gdy próbuję ocenić funkcję siebie, biorąc pod uwagę tę definicję aplikacyjnych na funktora ((->) R):
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
czytam ocenę powyższej wypowiedzi, jak:
(\x -> (3 + x) (100 * x)) $ 5
Ale nie widzę, w jaki sposób możemy komponować dwa częściowo zastosowane funkcje binarne jako pojedynczy lambda (w rzeczywistości GHCi rzuca nieskończoną typu błędu próbuje powiązać to zmienna). Ponadto do interpretacji roboczego, jeśli spojrzymy na definicji typu dla <$>
otrzymujemy:
(<$>) :: Functor f => (a -> b) -> f a -> f b
lub dokładniej możemy spojrzeć na jego zniesienie jako:
(<$>) :: Functor f => (a -> b) -> (f a -> f b)
Biorąc pod uwagę, że naszym funktorem w tym przypadku jest ((->) r), mogę wywnioskować, że to właśnie transformacja ma miejsce w poprzedniej ewaluacji (zakładając, że pierwsze zobiektywizowanie dzieje się pierwsze, zamiast odpowiedniej skojarzeniowej aplikacji 5
):
(\x -> a + b)
gdzie a
= (+ 3)
i b
= (* 100)
. Jest to funkcja, która powinna zostać zwrócona. Czy jednak mam rację zakładając, że jest to ostateczna (szorstka) forma?
(\x -> (3 + x) + (100 * x)) $ 5
... co daje 508.
znajdę opis Lipovača jest bardziej zrozumiały w kategoriach jak działa wyrażenie, ale mój gut mówi mi, nie jest do końca prawda o szczegóły Gorey ramach celu Okap kompilatora Haskell. Łatwiej mi myśleć, że fmapa (+) zdarzyła się jako pierwsza, co skutkuje funkcją z dwoma funktorami, które są częściowo zastosowanymi funkcjami, które pobierają współdzielone dane wejściowe, a następnie zastosowaliśmy do niej wartość. Możemy to zrobić z powodu leniwej oceny. Czy to źle?
„czytam ocenę powyższej wypowiedzi jak:' (\ x -> (3 + x) (100 * x)) 5 USD ". Podpowiedź: w twojej ocenie brakuje '((+) <$>)', ergo błąd typu. – duplode
Tak, dlatego kontynuuję i włączam w drugiej połowie. – RJS
Ups - nieważne, źle odczytałem środkową część pytania. – duplode