[Haskell] 지연 평가와 지연 방지
하스켈에서는 처참한 성능을 조금이나마 지연 평가를 사용할 때가 많다.
그러지 않으면 재귀 스택 타다가 메모리 미친듯이 쳐먹고 터지기도 쉽기 때문이다. 그냥 느려서일 수도 있고.
그래서 이런 식으로 Data.Text.Lazy => readFile 같은 기능을 써서 lazy한 형태로 처리를 해야할때가 많은데
근데 이게 또 그리 깔끔하게 처리되는건 아니다. 실행순서를 완전히 보장하진 못한다.
그래서 이렇게 실행 후 타이머를 재더라도, 실행 순서가 꼬여서
solution 실행에서 멈추지도 않은 채로 다음 코드를 실행해버린다.
이건 하스켈이 실제 리턴값이 필요할때가 아니면 바로 함수를 실행하지 않게끔 컴파일하기 때문이다.
타이머 측정은 또 그 결과와 의존관계가 없다보니, 이런 부분에서 의도치 않은 사이드이펙트가 발생한다.
이 문제를 해결하려면 강제로 저 함수가 반환하는 got 값에 대해서 강제로 평가를 해야한다.

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