게으른 평가는 순전히 기능적인 프로그래밍 언어의 '성능 회복'이라는 공통적 인 속성이며 아주 간단하게 작동합니다. 필요할 때만 표현식을 평가할 수 있습니다. x가 참으로 하스켈에서, 다른, 두에 X + 2이면, x + 3 평가 및 반환 같은 경우 예를 들어, 엄격한 (열망) 평가에서
if x == 1 then x + 3 else x + 2
하스켈
고려, 그런 일이 일어나지 않는다, X + 3 단지 예를 들어, 표현에게로 구성되어, 내가 가진 말 :
let x = if x == 1 then x + 3 else x + 2
그럼 내가 저장이 나는 결코 이제까지 이제까지 이제까지 인해 다른 조건문에이 변수를 사용하여 변수에,하지만 경우 흠? 내 CPU에 매우 비싼 정수를 낭비했다. (좋아, 실제로 당신이 이길 수는 없지만 더 큰 표현으로 아이디어를 얻는다.)
그런 다음 질문을하자. 왜 모두 게으른 언어인가?, 음, 간단한 이유는 순전히 표현식은 부작용이 전혀 없음을 보장합니다. 그들이 가지고 있었다면, 우리는 올바른 순서로 그들을 평가해야 할 것입니다. 그래서 대부분의 언어에서 열심히 평가됩니다. 표현에 부작용이없는 언어에서는 게으른 평가에 위험이 없으므로 다른 지역에서 잃는 경향이있는 실적을 되 살리는 것이 합리적입니다.
흥미로운 또 다른 부작용은 하스켈의 if-then-else가 실제로 Bool -> a -> a -> a
유형의 함수라는 것입니다. Haskell에서 이는 부울 유형의 인수 하나를 취하고 다른 유형의 다른 유형은 첫 번째 유형과 동일한 유형의 인수를 취하고 해당 유형을 다시 리턴한다는 것을 의미합니다. 값이 필요할 때만 평가되기 때문에 값이 계산되기 때문에 프로그램의 끝 부분에있는 대용량 표현식이 작성된 후 값이 평가되고 최종 결과에 대해 평가되고 버려지기 때문에 값이 계산되므로 다른 제어 분기의 무한한 평가를 수행하지 않습니다 컴파일러가 최종 결과에 필요하지 않다고 생각하는 모든 것. 예를 들어, 아주 복잡한 표현식을 그 자체로 나눌 경우 두 부분을 모두 평가하지 않고 '1'을 대치 할 수 있습니다. 일부 구문은 말을하지만
의 차이는 전통적으로 엄격하게 평가 계획에 표시되지만 if
이 기능하지 않기 때문에 오류가 계획 (display (apply if (> x y) "x is larger than y" "x is not larger than y"))
에 게으른 계획이라고 게으른 변종이있다, 그것은 전문 구문 (의 Scheme에서 특별한 것은 아닙니다.) 모든 인수를 반드시 평가할 필요는 없으므로, 예를 들어 팩토리얼을 계산하려고하면 메모리가 부족합니다. Lazy Scheme에서는 함수가 디스플레이와 같이 계속해서 평가를 위해 결과를 필요로 할 때까지는 아무 것도 평가되지 않으므로 잘 작동합니다.
다운 투표에 대한 의견? – Earlz
여기에 많은 질문을하고 있습니다 : 1) 게으른 평가의 이점, 2) 성능, 3) 구현 방법. 3 가지 별도의 질문으로 나누는 것이 좋습니다. – Juliet