如何计算列表中有多少元素?

时间:2015-11-09 00:17:17

标签: list haskell

我知道length函数,但如果我有[(1,2),(2,3),(3,4)]之类的列表并尝试使用length则无效。我试图连接,但这没有帮助。知道怎么样?

2 个答案:

答案 0 :(得分:6)

虽然9000指出,对你当前问题的明智解决方案是(2 *) . length,但值得一提的是为什么length [(1,2),(2,3),(3,4)]没有达到预期的效果。 Haskell列表包含任意数量的相同类型的元素。但是,Haskell对恰好有两个可能不同类型的元素,这些元素是完全不同的,并且不会隐式转换为列表(有关该点的进一步讨论,请参阅this question)。但是,没有什么能阻止我们自己编写转换函数:

pairToList :: (a, a) -> [a]
pairToList (x, y) = [x, y]

请注意pairToList的参数类型为(a, a);也就是说,该函数只接受具有相同类型的两个元素的对。

鉴于pairToList,我们可以转换列表中的对...

GHCi> map pairToList [(1,2),(2,3),(3,4)]
[[1,2],[2,3],[3,4]]

...然后按原计划继续进行:

GHCi> (length . concat . map pairToList) [(1,2),(2,3),(3,4)]
6

concatMap功能将mapconcat合并为一次......

GHCi> :t concatMap
concatMap :: Foldable t => (a -> [b]) -> t a -> [b]

...所以你的功能变得简单:

GHCi> (length . concatMap pairToList) [(1,2),(2,3),(3,4)]
6

答案 1 :(得分:4)

length [(1,2),(2,3),(3,4)]为您提供3,因为列表中正好有三个元素,元素是元组,每个元素由两个整数组成。使用此函数获取所有“元素”

tupleLength :: [(Int, Int)] -> Int
tupleLength = (*2) . length