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