我是Haskell的新手,在嘗試理解一些東西時玩弄。如果我這樣做,我收到了一個問題:Haskell列表被凍結
list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
返回[1,2,3,4
。它沒有末端括號,所以就好像列表正在加載或凍結一樣。下面是它的外觀:
Prelude> print list2
[1,2,3,4
這是怎麼回事?
我是Haskell的新手,在嘗試理解一些東西時玩弄。如果我這樣做,我收到了一個問題:Haskell列表被凍結
list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
返回[1,2,3,4
。它沒有末端括號,所以就好像列表正在加載或凍結一樣。下面是它的外觀:
Prelude> print list2
[1,2,3,4
這是怎麼回事?
你知道列表單調遞增,但Haskell沒有。使用takeWhile
,而不是一個列表理解,使list1
可以停止正在評估一旦你找到一個值大於4
> list1 = [1..]
> list2 = takeWhile (<= 4) list1
> print list2
[1,2,3,4]
會發生什麼事是list1
仍在計算,併爲list1
謂詞x <= 4
的每個新元素被應用,這是false
爲每x
4
後。
因此,簡言之:
印出list2
解釋需要計算list1
,並檢查各列表項,這是<= 4
,因爲list1
是它的無窮計算必須採取無限長的時間。
您正在採取list1
中的每個元素,並且對於每個小於4的元素,使其成爲list2
中的條目。看看你在list1
有多少元素。
假裝你是GHCI。你的用戶給你一個無限的列表,並要求你找到列表中小於或等於4的所有值。你會怎麼做呢? (請記住,您不知道該列表是按順序排列的。) – user2297560
啊,是的,這是有道理的。有沒有辦法處理這樣的無限列表和條件? – greenthumbtack
你可以從'list1'獲取4個元素(從字面上看'list2 = take 4 list1') – user28434