haskell - 使用 Int 类型与积分约束。优势?

标签 haskell int typeclass

考虑这些(或多或少)等价的类型签名:

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

f2f1 更通用,这是一个很大的优势,但是 f1f2 有优势吗?

似乎在 H-99 问题的解决方案中,以及在许多已发布的各种欧拉计划问题的解决方案中,f1 形式出现的频率远高于 f2.

我不知道为什么。仅仅是程序员的懒惰,还是使用更通用的版本(f2)会降低性能,还是有其他原因?

最佳答案

  • 这通常是因为人们希望将积分与来自 length 的结果和其他已经受限于 Int 的函数结合使用。虽然经常有 generic* 函数,例如 genericLength,但这些名称较长且不在 Prelude 中。

  • Int 的性能更容易理解。 Integral a 的性能在很大程度上取决于函数是否专门针对 Integral 的特定实例。

  • Int 通常不仅足够而且诚实。例如,假设您的编译器使用机器字或更大的 Ints 而不是该死的标准29+ bits .

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

关于haskell - 使用 Int 类型与积分约束。优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3920891/

相关文章:

haskell - 在列表上使用不同的排序

function - Haskell 中缀函数应用优先级

haskell - 类型类约束的存在量化

haskell - 受类型类限制的类型项列表

scala - Aux 模式在 Scala 中完成了什么?

haskell - 你如何在 Haskell 中构建一个有状态的模块?

haskell - 如果 applicative 就足够了,为什么序列需要 monad?

sql-server - T-SQL 确定性 INT 转换

Java:多次设置int值

c - C 中的无符号整型乘法