2017-02-23 2 views
3

저는 하스켈을 좋아하고 몇 가지를 이해하려고 애쓰는 것을 좋아합니다. [1,2,3,4을 반환Haskell 목록이 고정되었습니다.

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

: 다음과 같은 처리를 할 경우 나는 문제를받을 수 있습니다. 끝 괄호가 없으므로 목록이로드되거나 고정되어있는 것처럼 보입니다. 여기 보이는 모습입니다 :

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

여기 무슨 일이 일어나고있는 걸까요? 어떻게됩니까

+7

이상 4. 당신이 GHCI을 가장하십시오 값을 찾으면 list1 평가하고 중지 할 수 있도록, 대신에 지능형리스트의, takeWhile를 사용합니다. 사용자는 무한한 목록을 제공하고 목록에있는 4보다 작거나 같은 모든 값을 찾도록 요청합니다. 어떻게 할 것입니까? (목록에 순서가 있음을 알지 못한다는 것을 명심하십시오.) – user2297560

+1

아, 맞습니다. 이와 같은 무한한 목록 및 조건을 처리 할 수있는 방법이 있습니까? – greenthumbtack

+1

'list1'에서'take 4' 엘리먼트를 사용할 수 있습니다 (말 그대로'list2 = take 4 list1') – user28434

답변

7

당신은 목록이 단조롭게 증가하고 있지만 하스켈은 그렇지 않다는 것을 알고 있습니다. 당신이

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

list1는 여전히 계산되고 있는지, 그리고 list1 술어 x <= 4 새로운 각 요소마다 x4 후 대한 false 인 적용된다.

그래서, 요약 :

list1을 계산하고 <= 4 것을 각 목록 항목을 확인하는 list2 통역의 필요성을 인쇄 출력하고, list1이기 때문에 그것의 무한한 계산은 무한의 시간이 걸릴해야합니다.

2

모든 요소를 ​​list1에 넣고, 각각의 요소가 4보다 작 으면 list2에 항목을 만듭니다. list1에 몇 개의 요소가 있는지보십시오.

관련 문제