Haskell 使用Int类型与Integral约束。优势?
考虑以下(或多或少)等效类型签名:Haskell 使用Int类型与Integral约束。优势?,haskell,int,typeclass,Haskell,Int,Typeclass,考虑以下(或多或少)等效类型签名: f1 :: [a] -> Int -> a f2 :: Integral b => [a] -> b -> a f2比f1更普遍,这是一个很大的优势,但是f1比f2有优势吗 似乎在H-99问题的解决方案中,以及在许多发布的各种项目Euler问题的解决方案中,f1形式比f2形式更常见 我不知道为什么。这仅仅是程序员的懒惰,还是使用更通用的版本(f2)会带来性能成本,还是还有其他原因? 这通常是由于人们希望将积分与length和其他
f1 :: [a] -> Int -> a
f2 :: Integral b => [a] -> b -> a
f2比f1更普遍,这是一个很大的优势,但是f1比f2有优势吗
似乎在H-99问题的解决方案中,以及在许多发布的各种项目Euler问题的解决方案中,f1形式比f2形式更常见
我不知道为什么。这仅仅是程序员的懒惰,还是使用更通用的版本(f2)会带来性能成本,还是还有其他原因?- 这通常是由于人们希望将积分与
和其他已限制为length
的函数的结果结合使用。虽然通常有Int
*函数,如通用
,但这些名称较长,不在序言中通用长度
的性能更容易理解。Int
的性能很大程度上取决于函数是否专门用于Integral a
的特定实例Integral
通常不仅足够,而且诚实。例如,如果您的编译器使用机器字或更大的Int
s而不是标准,则strictInt
s不能超过ByteString
大小(通常,请不要用深奥的示例进行注释)Int
- 过度使用类型类会弄乱签名,使语言可读性降低。如果极端泛化变得普遍,特别是对于原始函数,我认为我们需要找到一种更简洁的方式来表达约束,以避免让程序员发疯