gpt4 book ai didi

haskell - 做符号和绑定(bind)签名

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

我是 Haskell 和函数式编程的新手,我想知道为什么这样的示例(“嵌套循环”)有效:

do
a <- [1, 2, 3]
b <- [4, 5, 6]
return $ a * 10 + b

下面的一些东西是一种伪 Haskell 语法,但我希望它能说明我的理解。

我的理解是变成了这样的
[1, 2, 3] >>= \a -> 
([4, 5, 6] >>= \b ->
return $ b * 10 + a)

我认为这个表达式
[4, 5, 6] >>= \b -> return $ b * 10 + a

生成部分应用函数列表
[[40 + a], [50 + a], [60 + a]]

连接到
[40 + a, 50 + a, 60 + a]

对于最后一步,如下所示
[1, 2, 3] >>= \a -> [40 + a, 50 + a, 60 + a]

变为
[41, 51, 61, 42, 52, ... ]

我的困境是因为 return $ b * 10 + a 的类型似乎与 [40 + a, 50 + a, 60 + a] 的类型不同.

绑定(bind)签名不应该是这样的吗?
 (>>=)  :: m a -> (a -> m b) -> m b

在这个例子中似乎是
[int] -> (int -> [int -> int -> int]) -> [int -> int]


[int] -> (int -> [int -> int]) -> [int]

最佳答案

我认为它令人困惑的原因是因为你正在处理这个由内而外的工作,试图将内部绑定(bind)视为生成部分应用函数的列表。它没有:ab已关闭,而不是等待应用的参数。相反,从表达式的外部开始向内工作:

[1, 2, 3] >>= \a -> (...)

对于列表中的每个项目,以某种方式生成一个列表,可以访问 a作为原始列表中项目的名称
... [4, 5, 6] >>= \b -> (...)

要生成上一步所需的列表,请生成一个可以访问 a 的新列表。和 b ,两个编号列表中的每一个。
... return $ b * 10 + a

要生成上一步所需的列表,请创建单个项目的列表,其值为 b * 10 + a .

你问为什么 return $ b * 10 + a 的类型与 [40 + a, 50 + a, 60 + a] 的类型不同,但它们不是:两者都是 [Int] 类型.都不涉及任何功能。相反,它们都是数字列表,通过引用已经封闭的变量来构建。确实 (>>=)具有应有的类型:它需要一个 int 列表,以及一个用于从单个 int 生成 int 列表的函数,并返回一个不同的 int 列表:
(>>=) :: [Int] -> (Int -> [Int]) -> [Int]

关于haskell - 做符号和绑定(bind)签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53785844/

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