gpt4 book ai didi

haskell - 哪个应用仿函数用于传递共享参数?

转载 作者:行者123 更新时间:2023-12-03 20:31:54 24 4
gpt4 key购买 nike

我想我有点理解应用仿函数在 Haskell 中是如何工作的,并且我将它们用于基本数据类型(也许,或者......)。但是,我发现 this question用下面的例子:

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

可以用应用风格重写:
withPool = bracket <$> takeConn <*> putConn

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

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

最佳答案

统一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.Instances , 而不是 Control.Monad .至少如果我没记错的话。

关于haskell - 哪个应用仿函数用于传递共享参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com