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

时间:2014-09-24 15:08:17

标签: haskell

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

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

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

1 个答案:

答案 0 :(得分:9)

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

这样的列表理解将变成实际的monadic列表代码:

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的{​​{1}}个实例的定义:

[]

所以替换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成为lambda函数的参数,然后映射到目标列表。< / p>