16

の代わりにfmap、ファンクター内の値に関数を適用します。

fmap :: Functor f => (a -> b) -> f a -> f b

ファンクターに関数があり、値が単純な関数が必要でした。

thing :: Functor f => f (a -> b) -> a -> f b

しかし、私は1つを見つけることができません

このパターンは何と呼ばれ、ファンクター内の関数(またはアプリケーション内、またはモナド内)をプレーンな値に適用しますか?

私はすでにそれを実装しました、私は自分が何をしたのか、そしてなぜ標準ライブラリにそのような関数がまだなかったのかを完全には理解していません。

4

2 に答える 2

19

これは必要ありませんApplicativeFunctorうまくいくでしょう:

apply f x = fmap ($ x) f
-- or, expanded:
apply f x = fmap (\f' -> f' x) f

興味深いことに、apply実際にはflip;の一般化です。lambdabotflipは、標準のHaskellの一般化の1つとしてこの定義に置き換えられているため、紛らわしい名前ですが、これが可能な名前です。

ちなみに、Hayoo(Hoogleとは異なり、Hackage全体を検索する)を試して、関数によく付けられる名前と、それが汎用パッケージに含まれているかどうかを確認することは、多くの場合価値があります。を検索すると、 (パッケージから)および(パッケージから)可能な名前f (a -> b) -> a -> f bが見つかります。それでも、私はおそらく使用サイトで使用するでしょう。flipData.Functor.Syntaxfunctors($#)synthesizerfmap ($ arg) f

于 2012-04-25T16:52:00.810 に答える
7

Niklasが言うように、これはいくつかの応用ファンクターでの応用であり、価値を高めます。

\f a -> f <*> pure a

:: Applicative f => f (a -> b) -> a -> f b

またはより一般的に(?)、カテゴリを使用 (.)

\f a -> f . pure a

:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c
于 2012-04-25T16:30:41.030 に答える