先日learnyouahaskellを終えたばかりで、Haskell Wikiで説明されているように、単相性制限の意味を理解しようとしていました。MRが繰り返し評価を防ぐ方法を理解していると思いますが、なぜこれらの繰り返し評価がはるかに簡単な手段で回避できないのかを理解できません。
私が念頭に置いている特定の例は、wikiで使用されているものです。
f xs = (len,len)
where
len = genericLength xs
where genericLength
はタイプNum a => [b] -> a
です。
明らかに、それは同じ引数を持つ同じ関数なのでgenericLength xs
、評価するために一度だけ計算する必要があり(len,len)
ます。そして、それをf
知るために呼び出しを見る必要はありません。では、なぜHaskellはMRのようなルールを導入せずにこの最適化を行えないのでしょうか?
そのwikiページの議論Num
は、具体的な型ではなく型クラスであるという事実と関係があると言っていますが、それでも、コンパイル時に純粋な関数が同じ値を返すことは明らかではありません-したがって、同じ具体的なタイプのNum-同じ引数を2回与えたとき?
f [] :: (Int, Float)
。今では完全に理にかなっています。ありがとうございました。