gpt4 book ai didi

haskell - 将超过 1 个参数传递给 monad

转载 作者:行者123 更新时间:2023-12-04 18:11:18 25 4
gpt4 key购买 nike

我正在学习 Haskell 并编造一些例子。我不确定为什么第二个示例不起作用

foo :: Int -> Int -> Maybe Int
foo 0 0 = Nothing
foo a b = Just $ a + b

bar :: Int -> Maybe Int
bar 0 = Nothing
bar a = Just $ a + 1

-- This works
Just 4 >>= bar

-- Why this doesn't work?
(Just 4 Just 4) >>= foo

-- This works
do
a <- Just 3
b <- Just 4
foo a b

最佳答案

正如评论所说,(Just 4 Just 4)尝试应用构造函数 Just到 3 个参数时,它只需要一个。所以,我假设你想要 (Just 4, Just 4) 之类的东西。 ,并希望它像您的最后一个示例一样工作。
“绑定(bind)”运算符的类型是 (>>=) :: Monad m => m a -> (m a -> b) -> m b .这意味着在运算符之后预期的函数只接受一个参数,而不是两个。所以,再一次,它不起作用的最终原因是,你的函数接受了错误数量的参数。 (部分应用意味着您不必一次提供所有参数,但听起来您希望其他一些数据被神奇地路由到缺少的参数......)
为您的 do 脱糖以 >>= 为例表格翻译为:

Just 3 >>= \a -> Just 4 >>= \b -> foo a b
为了更清楚一点,我将括号括起来:
Just 3 >>= ( \a -> Just 4 >>= (\b -> foo a b) )
这使您更容易看到您可以简化内部 lambda:
Just 3 >>= ( \a -> Just 4 >>= foo a )
所以,毕竟有可能将丢失的数据路由到额外的参数!但是,您必须自己制定路由...
Haskell 函数没有什么特别神奇的地方。与动态语言相比,它们往往更注重如何调用它们。这里最大的“魔力”是类型检查器通常可以判断您何时没有正确使用它们。
而且(正如其他答案所指出的) >>= 并没有什么神奇之处。 -- 它只是另一个函数,为了理解如何使用它,你需要看一下它的类型。

关于haskell - 将超过 1 个参数传递给 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72427942/

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