【问题标题】:How to count how many elements are in a list?如何计算列表中有多少元素?
【发布时间】:2015-11-09 00:17:17
【问题描述】:

我知道length 函数,但是如果我有一个诸如[(1,2),(2,3),(3,4)] 之类的列表并尝试使用length 它不起作用。我试图连接,但这没有帮助。知道怎么做吗?

【问题讨论】:

  • 显然是(*2) . length,因为每个元素都是一个二元组。 (提示:Haskell 在数据结构方面与 Python 或 JS 非常不同。)
  • 显然长度是 3 并且每个元素都是一个元组 - 如果你寻找一个函数 'concatMap' 并将元组转换为列表(注意:那么这些元组需要是同质的)与一个辅助函数你可能会得到答案 6
  • 不工作是不是的问题描述。如果您收到错误,请发布 1) 我们可以用来重现错误的最小代码和 2) 完整的错误消息。如果您获得的结果不是您想要的,您必须提供 1) 您得到的结果和 2) 您期望的结果以及您使用的输入。

标签: list haskell


【解决方案1】:

虽然您当前问题的明智解决方案是 (2 *) . length,但正如 9000 指出的那样,值得详细说明为什么 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

【讨论】:

  • 我坚持认为length . concatMap pairToList 解决方案严格低于(*2) . length 解决方案,应该拒绝支持后者。问题是,对于[(a, a)],只要知道 type 就可以保证列表中的每个元素都是具有两个元素的对。 (*2) . length 解决方案利用了这个保证,而 length . concatMap pairToList 没有。
  • @LuisCasillas 我改写了开头的句子以使其更清楚(答案的其余部分更多是为了澄清问题中隐含的混淆)。
【解决方案2】:

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

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

【讨论】:

  • 我在这里挑剔,但pairListLength 会是一个更好的名字; “元组”这个词太笼统了。
猜你喜欢
  • 2011-08-04
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多