좋아요, 그래서 이것은 잠시 나를 괴롭 히고 있습니다. 그래서 저는 실제로 와서 대답을 알 수있는 누군가에게 물어볼 것이라고 생각했습니다.서브 표현식을 한 번 실행하십시오
가정하자 I는 다음과 같은 기능을 가지고
가foobar x y = expensive x + cheap y
가정 또한, 프로그램의 일부는 입력으로 foobar 5
취하고, 타이트 루프에서 시간의 함수 수백만을 실행한다. 분명히 나는 expensive 5
을 백만 번이 아니라 한 번 계산하려고합니다.
에 의해 중복 작업을 제거 할만큼 똑똑 GHC인가 ... 그대로
나는 코드를 떠날 수, 또는 나는
foobar x = let k = expensive x in \ y -> k + cheap y
이 궁금 나에게 잎으로 변경할 수 그 자체? (즉, 첫 번째 버전이 이미 원하는대로 작동합니까?)
아니요, 두 번째 버전이 실제로 문제를 해결합니까? (즉, 옵티마이는 첫 번째 버전과 같은 코드로 다시 변환 할 것인가?)
이것은 잠재적으로 의미를 변경하지 않는다.'map (foo 5) []; foo a b = undefined a + b'맵에 대해'foo 5'의 평가를 강요하면 불필요하게 불어납니다. – jozefg
@jozefg'let '은 평가를 강제하지 않습니다. 처음으로 필요할 때 평가됩니다 (그리고 이후의 모든 용도에 대해 희망적으로 공유 됨). –