用zf表示法实现长度函数

  • 本文关键字:函数 实现 zf 表示 haskell
  • 更新时间 :
  • 英文 :


如何通过使用列表推导实现Haskell中的长度函数?一个例子。

take [x| x<- [1,2,3], even]

正如在注释中指出的那样,如果您想要一个整数作为输出,则不可能仅使用列表推导式来计算列表的长度,因为列表推导式生成一个列表。然而,有一些方法可以使用列表推导式附加函数来获取长度。最经典的方法是

length x =
sum [ 1 | _ <- x ]

将列表中的每个元素替换为1,然后取和。

另一种比较直接的方式是:

length x =
last [ i | (_, i) <- zip (undefined : x) [0 ..] ]

这里我们将列表扩展1,使用列表推导式将列表中的每个元素替换为其索引,并取最后一个索引。你也可以用maximum代替last,这样就可以了。

还有更奇特的方式可以想象

length x =
foldr ($) 0 [ (+1) | _ <- x ]

但是我列举的实在太多了。

总的来说,这些可能不是非常习惯或实用的获取列表长度的方法。除了我在某些情况下看到的第一个,我不认为任何人会实现长度的任何这些方式。

最新更新