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.至少如果我没记错的话.