kes*_*kes 3 int haskell typeclass
考虑这些(或多或少)等效类型签名:
f1 :: [a] -> Int -> a
f2 :: Integral b => [a] -> b -> a
Run Code Online (Sandbox Code Playgroud)
f2比f1更通用,这是一个很大的优势,但f1优于f2?
似乎在H-99问题的解决方案中,以及许多项目欧拉问题的解决方案中,f1形式比f2更常出现.
我不知道为什么.是简单的程序员懒惰,还是在使用更通用的版本(f2)时是否有性能成本,还是有另一个原因?
这通常是由于人们希望将积分与length已经约束的结果和其他函数结合使用Int.虽然通常有generic*函数,例如genericLength,这些名称更长,而不是在Prelude中.
表现Int更容易理解.性能Integral a取决于很大程度上取决于函数是否专门针对特定实例Integral.
Int通常不仅足够而且诚实.例如,严格的ByteStrings不能超过一个Int大小(通常,请不要用深奥的例子进行评论)假设您的编译器使用机器字或更大的Ints而不是标准的29+位.
过度使用类型类会使签名变得混乱,使语言的可读性降低.如果极端泛化变得普遍,特别是对于原始函数,我认为我们需要找到一种更简洁的方式来表达限制,以防止程序员疯狂.