前几天,我刚学完了youahaskell,并且试图理解Haskell Wiki中描述的“单态限制” 。我想我了解MR如何防止重复评估,但是我看不出为什么用更直接的方法无法避免重复评估。
我想到的具体示例是Wiki使用的示例:
f xs = (len,len)
where
len = genericLength xs
哪里genericLength
是类型Num a => [b] -> a
。
显然,genericLength xs
只需计算一次即可求值(len,len)
,因为它是具有相同参数的相同函数。我们不需要f
知道任何调用即可知道这一点。那么,为什么Haskell不能在不引入MR之类的规则的情况下进行此优化?
那个Wiki页面上的讨论告诉我,它与Num
类型类而不是具体类型有关,但是即使这样,在编译时纯函数是否返回相同的值也不应该很明显- -并因此使用相同的Num具体类型-两次给相同的参数?
f [] :: (Int, Float)
。现在,它变得非常合理。谢谢。