2017-02-23 72 views
3

我是Haskell的新手,在嘗試理解一些東西時玩弄。如果我這樣做,我收到了一個問題:Haskell列表被凍結

list1 = [1..] 
list2 = [x | x <- list1, x <= 4] 
print list2 

返回[1,2,3,4。它沒有末端括號,所以就好像列表正在加載或凍結一樣。下面是它的外觀:

Prelude> print list2 
[1,2,3,4 

這是怎麼回事?

+7

假裝你是GHCI。你的用戶給你一個無限的列表,並要求你找到列表中小於或等於4的所有值。你會怎麼做呢? (請記住,您不知道該列表是按順序排列的。) – user2297560

+1

啊,是的,這是有道理的。有沒有辦法處理這樣的無限列表和條件? – greenthumbtack

+1

你可以從'list1'獲取4個元素(從字面上看'list2 = take 4 list1') – user28434

回答

7

知道列表單調遞增,但Haskell沒有。使用takeWhile,而不是一個列表理解,使list1可以停止正在評估一旦你找到一個值大於4

> list1 = [1..] 
> list2 = takeWhile (<= 4) list1 
> print list2 
[1,2,3,4] 
4

會發生什麼事是list1仍在計算,併爲list1謂詞x <= 4的每個新元素被應用,這是false爲每x4後。

因此,簡言之:

印出list2解釋需要計算list1,並檢查各列表項,這是<= 4,因爲list1是它的無窮計算必須採取無限長的時間。

2

您正在採取list1中的每個元素,並且對於每個小於4的元素,使其成爲list2中的條目。看看你在list1有多少元素。