Я изучаю Притчи Хаскеля. Мне кажется (я, вероятно, ошибаюсь), что pure
функция на самом деле не нужна, например:
pure (+) <*> [1,2,3] <*> [3,4,5]
можно записать как
(+) <$> [1,2,3] <*> [3,4,5]
Может кто-нибудь объяснить преимущество, которое pure
дает функция по сравнению с явным отображением fmap
?
haskell
applicative
Джил Шафрири
источник
источник
pure f <*> x
это точно так же, какfmap f x
. Я уверен, что есть некоторые причины, по которым онpure
был включенApplicative
, но я не совсем уверен, почему.pure
позволяет использовать, ну, «чистые» значения в вычислениях Applicative. Хотя, как вы правильно заметили,pure f <*> x
это то же самое, чтоf <$> x
, например , не существует такого эквивалентаf <*> x <*> pure y <*> z
. (По крайней мере, я так не думаю.)Monoid
классом - в которойpure
соответствуетMonoid
элемент идентичности России. (Это говорит о том, чтоApplicative
безpure
может быть интересным, посколькуSemigroup
- то естьMonoid
без необходимости иметь идентичность - все еще используется. На самом деле, теперь я думаю об этом, мне кажется, я вспоминаю, что PureScript имеет именно такойpure
класс «Applicative без », хотя я не не знаю, для чего он используется.)fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, я думаю. Идея есть вApplicative
документации как закон "обмена".Applicative
безpure
существует какApply
из полугрупповых .Ответы:
Я здесь на грани своей компетенции, так что не принимайте это больше, чем есть, но это было слишком долго для комментариев.
Могут быть практические причины для включения
pure
в класс типов, но многие абстракции Haskell основаны на теоретических основах, и я считаю, что это также относится и кApplicative
. Как сказано в документации, это сильный слабый моноидальный функтор (подробности см. На https://cstheory.stackexchange.com/q/12412/56098 ). Я полагаю, что этоpure
служит идентичностью , так же какreturn
и дляMonad
(который является моноидом в категории эндофункторов ).Рассмотрим
pure
иliftA2
:Если вы немного покоситесь, вы сможете представить, что
liftA2
это бинарная операция, о которой также говорится в документации:pure
то есть соответствующая идентичность.источник
Applicative
безpure
был бы, хм, полугрупповой функтор вместо моноидального.fmap
не всегда сокращает это. В частности,pure
это то , что позволяет вам представитьf
(гдеf
естьApplicative
), когда у вас его еще нет. Хороший примерОн берет список «действий», производящих значения, и превращает его в действие, создающее список значений. Что происходит, когда в списке нет действий? Единственный вменяемый результат - это действие, которое не дает никаких значений:
Если бы у вас этого не было
pure
, вам пришлось бы требовать непустого списка действий. Вы могли бы определенно заставить это работать, но это все равно, что говорить о сложении без упоминания 0 или умножения без 1 (как говорили другие, потому чтоApplicative
s моноидальны). Вы будете неоднократно сталкиваться с крайними случаями, которые легко разрешаются,pure
но вместо этого должны решаться странными ограничениями на ваши входные данные и другие вспомогательные средства.источник