gpt4 book ai didi

Haskell:为什么 'id' 使这个函数不再是单子(monad)函数?

转载 作者:行者123 更新时间:2023-12-02 12:09:23 24 4
gpt4 key购买 nike

我试图理解为什么在下面的序列的最后一行添加 id 会删除单子(monad)方面:

Prelude> :t id
id :: a -> a
Prelude> :t Control.Monad.liftM2
Control.Monad.liftM2
:: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
Prelude> :t Control.Monad.liftM2 (==)
Control.Monad.liftM2 (==)
:: (Monad m, Eq a) => m a -> m a -> m Bool
Prelude> :t Control.Monad.liftM2 (==) id
Control.Monad.liftM2 (==) id :: Eq a => (a -> a) -> a -> Bool
Prelude>

添加 id::a -> a 如何以最后一行中的方式更改签名?

最佳答案

您正在将类型固定为特定的 Monad实例,即“函数读取器”单子(monad)( instance Monad ((->) a) )。

id :: a -> a并且您尝试将其用作 m a 类型的参数的参数,所以:

m a  ~  a -> a
m a ~ (->) a a
m a ~ ((->) a) a
m ~ (->) a
a ~ a

签名的其余部分是:

m a -> m Bool

m ~ (->) a开始,结果类型为:

(->) a a -> (->) a Bool
(a -> a) -> (a -> Bool)
(a -> a) -> a -> Bool

(加上使用 Eq a 产生的 == 约束。)

这在无点代码中很有用,特别是使用Applicative例如,因为您可以隐式地将函数的参数“传播”到子计算:

nextThree = (,,) <$> (+ 1) <*> (+ 2) <*> (+ 3)
-- or
nextThree = liftA3 (,,) (+ 1) (+ 2) (+ 3)

nextThree 5 == (6, 7, 8)

uncurry' f = f <$> fst <*> snd
-- or
uncurry' f = liftA2 f fst snd

uncurry' (+) (1, 2) == 3

关于Haskell:为什么 'id' 使这个函数不再是单子(monad)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980338/

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