[Haskell] 지연 평가와 지연 방지

[원본 링크]

하스켈에서는 처참한 성능을 조금이나마 지연 평가를 사용할 때가 많다.
그러지 않으면 재귀 스택 타다가 메모리 미친듯이 쳐먹고 터지기도 쉽기 때문이다. 그냥 느려서일 수도 있고.

그래서 이런 식으로 Data.Text.Lazy => readFile 같은 기능을 써서 lazy한 형태로 처리를 해야할때가 많은데

근데 이게 또 그리 깔끔하게 처리되는건 아니다. 실행순서를 완전히 보장하진 못한다.


그래서 이렇게 실행 후 타이머를 재더라도, 실행 순서가 꼬여서


solution 실행에서 멈추지도 않은 채로 다음 코드를 실행해버린다.
이건 하스켈이 실제 리턴값이 필요할때가 아니면 바로 함수를 실행하지 않게끔 컴파일하기 때문이다.

타이머 측정은 또 그 결과와 의존관계가 없다보니, 이런 부분에서 의도치 않은 사이드이펙트가 발생한다.

이 문제를 해결하려면 강제로 저 함수가 반환하는 got 값에 대해서 강제로 평가를 해야한다.

이런 식으로 하면 된다.
그러면 solution의 결과를 사용한다는 것을 컴파일러에게 알렸으니, 이상한 순서 꼬임을 방지할 수 있다.