Uczę się Aplikacji Haskella. Wydaje mi się (prawdopodobnie się mylę), że pure
funkcja nie jest tak naprawdę potrzebna, na przykład:
pure (+) <*> [1,2,3] <*> [3,4,5]
można zapisać jako
(+) <$> [1,2,3] <*> [3,4,5]
Czy ktoś może wyjaśnić zalety tej pure
funkcji w porównaniu z jawnym mapowaniem fmap
?
pure
pozwala na użycie, no cóż, „czystych” wartości w obliczeniach aplikacyjnych. Chociaż, jak poprawnie obserwować, pure f <*> x
jest taka sama jak f <$> x
, nie ma takiego ekwiwalent za, powiedzmy f <*> x <*> pure y <*> z
. (Przynajmniej nie sądzę.)
Monoid
klasą - w którym pure
odpowiada Monoid
element tożsamości. (Sugeruje to, że Applicative
bez pure
może być interesujące, ponieważ Semigroup
- które Monoid
niekoniecznie musi mieć tożsamość - wciąż jest używane. Właściwie, teraz myślę o tym, wydaje mi się, że PureScript ma dokładnie taką pure
klasę „Aplikacja bez ”, chociaż nie nie wiem, do czego służy).
fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, tak myślę. Pomysł tkwi w Applicative
dokumentacji jako prawo „wymiany”.
pure f <*> x
jest dokładnie taki sam jakfmap f x
. Jestem pewien, że istnieje jakiś powód, dla któregopure
został włączonyApplicative
, ale nie jestem do końca pewien, dlaczego.