哪个applicative functor用于传递共享参数?

ond*_*dra 15 haskell applicative

我想我有点理解应用程序仿函数在Haskell中是如何工作的,我将它们用于基本数据类型(Maybe,Either ......).但是,我通过以下示例找到了这个问题:

withPool pool = bracket (takeConn pool) (putConn pool)
Run Code Online (Sandbox Code Playgroud)

可以用应用风格重写:

withPool = bracket <$> takeConn <*> putConn
Run Code Online (Sandbox Code Playgroud)

我很惊讶它编译,确实它按预期工作,但有人可以告诉我哪个Applicative Functor用于此以及如何定义?

更新:我想我弄清楚它是如何工作的,但我不知道它在哪里定义.

Car*_*arl 17

Unify f= (a ->)在类型签名中:

fmap :: (b -> c) -> (a -> b) -> (a -> c)
pure :: b -> (a -> b)
(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

唯一的原因,声明是语法上的不同,((->) a)VS (a ->)是,你不能在类型级别采取部分.所以你追逐类型之后最终得到这些:

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

instance Applicative ((->) a) where
    pure = const
    f <*> g = \x -> f x $ g x
Run Code Online (Sandbox Code Playgroud)

我很确定Functor实例是在Data.Functor,Applicative实例是在Control.Applicative.该Monad例如((->) a)是在一个陌生的点只有一个,在Control.Monad.Instances代替Control.Monad.至少如果我没记错的话.

  • 对于它的价值,这实际上是读者monad,减去`newtype`包装 - 这里的"共享参数"与"Reader"的"环境"相同.以类似的方式,`E err`是错误monad而`(,)w`是writer. (9认同)