을 감안할 때 : filter p xs
는, 하스켈은 5 경기와 큰 중간 결과를 생산하지 않고를 필터링 할 1K 일치하는 항목을 반환하는 경우하스켈 필터 기능 게으름
take 5 (filter p xs)
말?
을 감안할 때 : filter p xs
는, 하스켈은 5 경기와 큰 중간 결과를 생산하지 않고를 필터링 할 1K 일치하는 항목을 반환하는 경우하스켈 필터 기능 게으름
take 5 (filter p xs)
말?
이 일치도가 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
은이 다섯 가지 항목 중 첫 번째 항목 만 요구하기 때문에, 게으름은 바로이를 평가하기 때문입니다.
예, 그렇지 않습니다. 만약 그렇다면
는 다음과 같은 것을 더 이상
take 5 (filter (> 10) [1..])
이 기능은 Lazy evaluation라고 작동하지 않을 것입니다.
어떤 상황에서 "1K를 반환하겠습니까?"
(자바 또는 Ruby와 같은 일반적인 call-by-value 언어에서와 마찬가지로) 하스켈은 먼저 filter p xs
을 평가하여 작동하지 않습니다. 먼저 take 5
을 평가하여 작동합니다 (이 경우). take 5
은 filter p xs
으로 충분한 결과를 얻고 나머지는 평가하지 않습니다.
반드시 (심지어 5 ...을 취한다) 평가할 필요는 없지만, 그 값이 사용되는 방법에 따라 다릅니다. – augustss
예, 그렇지 않습니다. –