15

Haskellでアプリケーションファンクターがどのように機能するかをある程度理解していると思います。基本的なデータ型(多分、どちらか...)にそれらを使用しています。しかし、私は次の例でこの質問を見つけました:

withPool pool = bracket (takeConn pool) (putConn pool)

適用可能なスタイルで書き直すことができます:

withPool = bracket <$> takeConn <*> putConn

コンパイルされて実際に期待どおりに機能することに驚きましたが、これに使用されているApplicative Functorとその定義を誰かに教えてもらえますか?

更新:私はそれがどのように機能するかを理解したと思いますが、それがどこで定義されているのかわかりません。

4

1 に答える 1

17

Unify f=(a ->)型アノテーション:

fmap :: (b -> c) -> (a -> b) -> (a -> c)
pure :: b -> (a -> b)
(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c)

宣言が構文的に異なる唯一の理由は((->) a)(a ->)タイプレベルでセクションを取得することが許可されていないことです。したがって、タイプを追跡した後、これらになります。

instance Functor ((->) a) where
    fmap = (.)

instance Applicative ((->) a) where
    pure = const
    f <*> g = \x -> f x $ g x

FunctorインスタンスはにData.Functorあり、Applicativeインスタンスはにあると確信していますControl.Applicative。のMonadインスタンスは、の代わりに((->) a)、の奇妙な場所にある唯一のインスタンスです。少なくとも私が正しく思い出せば。Control.Monad.InstancesControl.Monad

于 2012-01-06T19:26:03.797 に答える