2014-04-24 3 views
1

을 감안할 때 : filter p xs는, 하스켈은 5 경기와 큰 중간 결과를 생산하지 않고를 필터링 할 1K 일치하는 항목을 반환하는 경우하스켈 필터 기능 게으름

take 5 (filter p xs) 

말?

+1

예, 그렇지 않습니다. –

답변

3

이 일치도가 xs 인 경우에만 p을 평가하여 일치 항목 5 개를 생성하는 데 필요한만큼 xs 만 스캔합니다.

더 정확하게 말하면 결과가 사용되는 방식에 따라 실제로 적은 계산을 수행 할 수 있습니다. 예를 들어,

main = do 
    let p x = (x==3) || (x>=1000000) 
     list1 = [0..1000000000] 
     list2 = take 5 (filter p list1) 
    print (head list2) 

은 다섯 개 가지 요소를 요구 take에도 불구하고, 더 이상 3까지 list1가 발견 스캔하지 것이다. head은이 다섯 가지 항목 중 첫 번째 항목 만 요구하기 때문에, 게으름은 바로이를 평가하기 때문입니다.

1

예, 그렇지 않습니다. 만약 그렇다면

는 다음과 같은 것을 더 이상

take 5 (filter (> 10) [1..]) 

이 기능은 Lazy evaluation라고 작동하지 않을 것입니다.

2

어떤 상황에서 "1K를 반환하겠습니까?"

(자바 또는 Ruby와 같은 일반적인 call-by-value 언어에서와 마찬가지로) 하스켈은 먼저 filter p xs을 평가하여 작동하지 않습니다. 먼저 take 5을 평가하여 작동합니다 (이 경우). take 5filter p xs으로 충분한 결과를 얻고 나머지는 평가하지 않습니다.

+0

반드시 (심지어 5 ...을 취한다) 평가할 필요는 없지만, 그 값이 사용되는 방법에 따라 다릅니다. – augustss