gpt4 book ai didi

Haskell 编写 >>= 使用 >=> Monad

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

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

bind :: Monad m => m a -> (a -> m b) -> m b

-- 你是如何使用>=>=>来写bind的?

我真的很困惑,我明白这两者是如何工作的,但我什至无法开始。

我尝试了以下所有替代方案:

bind1 a b = (b a)
bind2 a b = (a >=> b)
bind3 a b = (b >=> a)
bind4 a b = (a b)

但每次尝试都会引发错误。我可以从哪里开始回答这个问题?

因为>>=有2个参数,而>=>=>有3个,我怎么用>=>来写>>= 少1个参数时?

最佳答案

首先,我建议重命名类型参数,以便最终结果匹配:

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
bind :: Monad m => m a -> (a -> m c) -> m c

现在我们在第一个签名中有 b -> m c,在第二个签名中有 a -> m c;这也建议将 a 重命名为 b:

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
bind :: Monad m => m b -> (b -> m c) -> m c

剩下的主要区别在于有一个额外的参数a。但我们显然不需要它,所以我们不妨将它专门化为无信息类型 ()(或任何其他单值类型):

(>=>) :: Monad m => (() -> m b) -> (b -> m c) -> (() -> m c)
bind :: Monad m => m b -> (b -> m c) -> m c

() -> m x 实际上同构于单独的 m x:

addDummyArg :: a -> (() -> a)
addDummyArg c () = c
rmDummyArg :: (() -> a) -> a
rmDummyArg f = f ()

这只是使用这些转换函数使函数相互适应的问题。

关于Haskell 编写 >>= 使用 >=> Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71264819/

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