【问题标题】:Finding index of an element of a list of tuples with a wildcard使用通配符查找元组列表中元素的索引
【发布时间】:2020-08-09 07:59:08
【问题描述】:

我正在尝试使用 Haskell 查找元组列表中元素的索引,并使用通配符。

我已经调整了我的类型以使其更易于解释。目前我的思路是使用elemIndex。

例如,

> elemIndex 2 [1,2,3,4,5]
Just 1

但就我而言,我有一个元组列表,如下所示:

> elemIndex (2, 20) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1

我希望能够只提供元组的第一部分并获取索引,例如:

> elemIndex (2, _) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1

但我得到的结果是这样的:

<interactive>:58:15: error:
    • Found hole: _ :: Integer
    • In the expression: _
      In the first argument of ‘elemIndex’, namely ‘(2, _)’
      In the expression:
        elemIndex (2, _) [(1, 10), (2, 20), (3, 30), (4, 40), ....]
    • Relevant bindings include
        it :: Maybe Int (bound at <interactive>:58:1)

我在解读错误消息时遇到问题,也无法弄清楚如何解决该错误。 任何帮助将不胜感激,谢谢!

【问题讨论】:

  • _ 不是通配符。如果您在表达式中使用它(如在不是模式中),它是一个类型空洞,这通常用于给出“提示”要填充的类型。

标签: list haskell indexing tuples element


【解决方案1】:

_不是通配符,它​​是typed hole [haskell-wiki]。类型孔通常用于找出要填充的类型。

您可以在这里使用findIndex :: (a -&gt; Bool) -&gt; [a] -&gt; Maybe Int。在这里,您可以使用谓词 (a -&gt; Bool) 而不是指定要搜索的元素,然后该函数将为给定列表返回满足谓词的第一个索引(包装在 Just 数据构造函数中),或者Nothing 如果找不到元素。

因此您可以将其实现为:

Prelude Data.List> findIndex ((2 ==) . fst) [(1, 10),(2, 20),(3, 30),(4, 40),(5,50)]
Just 1

【讨论】:

  • 非常感谢您的详细解释,它确实帮助我理解了为什么它不正确并且不起作用
猜你喜欢
  • 2023-03-24
  • 2011-09-22
  • 2021-05-19
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2019-12-31
相关资源
最近更新 更多