如何通过使用列表推导实现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 ]
但是我列举的实在太多了。
总的来说,这些可能不是非常习惯或实用的获取列表长度的方法。除了我在某些情况下看到的第一个,我不认为任何人会实现长度的任何这些方式。