考虑这些(或多或少)等价的类型签名:
f1 :: [a] -> Int -> a
f2 :: Integral b => [a] -> b -> a
f2 比 f1 更通用,这是一个很大的优势,但是 f1 比 f2 有优势吗? ?
似乎在 H-99 问题的解决方案中,以及在许多已发布的各种欧拉计划问题的解决方案中,f1 形式出现的频率远高于 f2.
我不知道为什么。仅仅是程序员的懒惰,还是使用更通用的版本(f2)会降低性能,还是有其他原因?
最佳答案
这通常是因为人们希望将积分与来自
length
的结果和其他已经受限于Int
的函数结合使用。虽然经常有generic
* 函数,例如genericLength
,但这些名称较长且不在 Prelude 中。Int
的性能更容易理解。Integral a
的性能在很大程度上取决于函数是否专门针对Integral
的特定实例。Int
通常不仅足够而且诚实。例如,假设您的编译器使用机器字或更大的Int
s 而不是该死的标准29+ bits .过度使用类型类会混淆签名,使语言的可读性降低。如果极端泛化变得普遍,特别是对于原始函数,我认为我们需要找到一种更简洁的方式来表达约束,以免让程序员发疯。
关于haskell - 使用 Int 类型与积分约束。优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920891/