Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用Int类型与Integral约束。优势?_Haskell_Int_Typeclass - Fatal编程技术网

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
    通常不仅足够,而且诚实。例如,如果您的编译器使用机器字或更大的
    Int
    s而不是标准,则strict
    ByteString
    s不能超过
    Int
    大小(通常,请不要用深奥的示例进行注释)

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