나는 얼마전에 learnyouahaskell을 끝냈고 , Haskell Wiki가 묘사 한 것처럼 Monomorphism Restriction을 이해하려고 노력했습니다 . MR이 어떻게 반복적 인 평가를 막을 수 있는지 이해하고 있지만, 왜 반복적 인 평가를 더 간단한 방법으로 피할 수 없는지 모르겠습니다.
내가 염두에두고있는 구체적인 예는 위키에서 사용되는 예입니다.
f xs = (len,len)
where
len = genericLength xs
여기서 genericLength
type은입니다 Num a => [b] -> a
.
분명히 동일한 인수를 가진 동일한 함수이므로 genericLength xs
평가하기 위해 한 번만 계산하면됩니다 (len,len)
. 그리고 우리는 그것을 f
알기 위해 어떤 호출도 볼 필요가 없습니다 . 그렇다면 왜 Haskell이 MR과 같은 규칙을 도입하지 않고이 최적화를 수행 할 수 없습니까?
이 위키 페이지에 대한 토론은 그것이 Num
구체적인 유형이 아닌 유형 클래스 라는 사실과 관련이 있다고 말하지만 컴파일 타임에 순수한 함수가 동일한 값을 반환한다는 것이 분명하지 않아야합니다. 똑같은 논증을 두 번 주었을 때 같은 구체적인 유형의 Num?
f [] :: (Int, Float)
. 이제는 완벽합니다. 감사합니다.