純粋なApplicativesの必要性


19

HaskellのApplicativesを学習しています。pureたとえば、関数は実際には必要ないようです(おそらく間違っています)。

pure (+) <*> [1,2,3] <*> [3,4,5]

次のように書くことができます

(+) <$> [1,2,3] <*> [3,4,5]

誰かpureが明示的なマッピングよりも関数が提供する利点を誰かに説明できますかfmap


1
あなたは正しいです— pure f <*> xとまったく同じfmap f xです。にpure含まれた理由は確かにありますが、その理由はApplicative完全にはわかりません。
Bradrn

4
私は答える時間がないので、とにかくこれが良いまたは完全なものになるとは確信していませんが、1つの観察:pureApplicative計算で「純粋な」値を使用できるようにします。あなたが正しく観察しているように、はとpure f <*> x同じf <$> xですが、たとえばに相当するものはありませんf <*> x <*> pure y <*> z。(少なくとも私はそうは思いません。)
ロビンジグモンド

3
別の、より理論的な正当化- 重要なクラスに密接に関連する代替の定式化がありますMonoid- のアイデンティティ要素にpure対応しMonoidます。(これは、必ずしもアイデンティティを持たない-がまだ使用されているため、興味深いことではApplicativeないpureことを示唆しています。実際、今考えてみると、PureScriptにはまさに「Applicative without 」クラスがあるのですが、それが何に使用されているかわからない。)SemigroupMonoidpure
ロビンジグモンド

2
@RobinZigmond fmap (\f' x' z' -> f' x' y z') f <*> x <*> z、私は思います。アイデアは、Applicative「交換」の法則としてドキュメントにあります。
HTNW

3
semigroupoidsからの @RobinZigmond Applicativepure存在しません。Apply
duplode

回答:


8

私はここで自分の能力の限界にいるので、これをそれ以上にとらないでください。しかし、コメントには少し長すぎました。

pure型クラスに含めるには実際的な理由があるかもしれませんが、Haskellの多くの抽象化は理論的な基礎から派生しており、私もそうだと思いますApplicative。ドキュメントが言うように、それは強力な緩やかなモノイドのファンクターです(詳細についてはhttps://cstheory.stackexchange.com/q/12412/56098を参照してください)。それpureアイデンティティの役目をするのと同じようreturnMonadエンドファンクターのカテゴリーのモノイドであると思います。

検討しpureliftA2

pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c

少し目を細めるとliftA2、それがバイナリ演算であると想像できるかもしれません。これもドキュメントに記載されています:

バイナリ関数をアクションに持ち上げます。

pureは、対応するIDです。


6
丁度。Applicativeなしpure、HM、だろうsemigroupal数子の代わりmonoidal 1。
leftaroundabout

20

fmap常にそれをカットするとは限りません。具体的にpureは、がない場合にを導入できるようにするものですffApplicative)。良い例は

sequence :: Applicative f => [f a] -> f [a]

値を生成する「アクション」のリストを受け取り、値のリストを生成するアクションに変換します。リストにアクションがない場合はどうなりますか?唯一の正気な結果は、値を生成しないアクションです。

sequence [] = pure [] -- no way to express this with an fmap
-- for completeness
sequence ((:) x xs) = (:) <$> x <*> sequence xs

を持っていない場合pureは、空でないアクションのリストを要求する必要があります。あなたは間違いなくそれを機能させることができますが、それは0について言及せずに加算または1なしで乗算について話しているようなものです(他の人が言っているように、Applicativesはモノイダルなので)。簡単に解決できるエッジケースに繰り返し出くわしますがpure、代わりに入力や他のバンドエイドの奇妙な制限によって解決する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.