gpt4 book ai didi

haskell - 列表推导中的变量是不可变的吗?

转载 作者:行者123 更新时间:2023-12-03 12:33:52 26 4
gpt4 key购买 nike

列表推导中的变量是不可变的吗?

[x + 1 | x <- [1,2,3,4,5]]

例如,在上面的例子中, x似乎改变了它的值(value)。这是真正发生的事情,还是这里的工作更复杂?

最佳答案

Haskell 中没有变量,只有绑定(bind)到名称的值。

像这样的列表推导实际上会变成一元列表代码:

y = [x + 1 | x <- [1, 2, 3, 4, 5]]
y = do
x <- [1, 2, 3, 4, 5]
return (x + 1)

然后这进一步减少到使用 >>= :
y = [1, 2, 3, 4, 5] >>= (\x -> return (x + 1))

然后我们可以查看 Monad 的定义。 [] 的实例:
instance Monad [] where
return x = [x]
list >>= f = concat (map f list)
-- uses the `concatMap` function in the actual definition
-- where `concatMap f list = concat (map f list)`

所以替换 return :
y = [1, 2, 3, 4, 5] >>= (\x -> [x + 1])

然后 >>= :
y = concat (map (\x -> [x + 1]) [1, 2, 3, 4, 5])

现在我们可以减少它:
y = concat [[1 + 1], [2 + 1], [3 + 1], [4 + 1], [5 + 1]]
y = concat [[2], [3], [4], [5], [6]]
y = [2, 3, 4, 5, 6]

如您所见,不是 x是一个改变值的变量, x成为 lambda 函数的参数,然后映射到目标列表。

关于haskell - 列表推导中的变量是不可变的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26020422/

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