我知道length
函数,但如果我有[(1,2),(2,3),(3,4)]
之类的列表并尝试使用length
则无效。我试图连接,但这没有帮助。知道怎么样?
答案 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
功能将map
和concat
合并为一次......
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