2010-10-13 48 views
3

考虑以下(或多或少)等效类型签名:使用Int类型与整体约束。优点?

f1 :: [a] -> Int -> a 
f2 :: Integral b => [a] -> b -> a 

F2F1更一般的,这是一个很大的优势,但有F1的优于F2

看来,在解决方案的H-99的问题,并在许多发布的解决方案,以各种项目欧拉问题,F1形式出现的频率比F2得多。

我不知道为什么。它只是程序员的懒惰,还是在使用更一般的版本(f2)时有性能成本,还是有其他原因?

回答

8
  • 这种情况往往是因为人们想从length结果,并已经受限于Int其他功能使用整体结合。虽然经常有generic *功能,例如genericLength,但这些名称较长,并且不在Prelude中。

  • 性能Int更容易理解。 Integral a的性能取决于功能是否专用于特定实例Integral的很大一部分。

  • Int往往不仅够,而且诚实。例如,严格的ByteString s不能超过Int的大小(通常,请不要评论深奥的例子),假设您的编译器使用机器字或更大的Int s而不是darned标准29+ bits

  • 过度使用类型混淆了签名,使得语言的可读性降低。如果极端泛化成为普遍现象,特别是对于原始函数,我认为我们需要找到一种更简洁的方式来表达约束,以防止程序员疯狂。