簡體   English   中英

列表推導中的變量是不可變的嗎?

[英]Are variables in list comprehensions immutable?

列表推導中的變量是不可變的嗎?

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

例如,在上面的例子中, x似乎改變了它的值。 這是真正發生的事情,還是在這里工作更復雜?

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實例的定義:

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函數,然后在整個目標列表映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM