实际上是Haskell中的通用长度函数

时间:2016-04-20 19:16:55

标签: haskell

length在输入方面是通用的,因为它接受任何Foldable

genericLength在输出上是通用的,因为它输出任何Integral

是否存在类型为

的实际完全通用函数
(Integral b, Foldable t) => t a -> b

甚至:

(Num b, Foldable t) => t a -> b

尽管长度应该只生成整数值,但整数也是浮点数,因此生成任何数字都可以正常工作。

目前我只是在使用:

foldl' (const (+ 1)) 0

我知道可以很容易地制作一个,但我也知道基本函数通常会以某种方式进行优化,所以我希望有一个通用函数来统计length。如果不是我的后续问题是为什么?特别是为什么不genericLength接受Foldable

1 个答案:

答案 0 :(得分:0)

我的意思是评论中已经回答了这个问题。但只是因为这个问题被标记为已回答,原因基本上是genericLength由于它支持懒惰的自然数而具有可怕的性能,因此几乎应该避免。通过重写规则可以部分避免这种性能问题,但即便如此,它仍然不是一个好用的功能,因此尝试进一步推广它是不值得的。