【问题标题】:I am wanting to create my own version of findIndices in Haskell我想在 Haskell 中创建自己的 findIndices 版本
【发布时间】:2021-04-08 21:45:41
【问题描述】:

我是 Haskell 的新手,我对语法不太熟悉。我基本上是在尝试从 Haskell 编写我自己的 findIndices 版本。这是我目前所拥有的:

findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices pred [] = []
findIndices pred (x:xs) = [n | n <- [0..length xs], pred x == True]

我被困在列表理解部分。我希望能够询问列表的所有元素是否 pred x == True,但这只会在列表的头部询问。有什么方法可以递归整个列表来询问 pred x == True 吗?

【问题讨论】:

  • x 是列表的第一个元素,xs 是其余元素,因此pred x 将始终为True 或始终为False,无论@ 的值如何987654327@.
  • 使用expr == True 与仅使用expr 完全相同,因为无论如何结果都是Bool 类型

标签: haskell functional-programming


【解决方案1】:

x 是列表的第一个元素,xs 是其余元素,因此pred x 将始终为True 或始终为False,无论n 的值如何。

您可以使用 zip :: [a] -&gt; [b] -&gt; [(a, b)] 同时枚举两个列表并构造 2 元组,因此:

findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices pred xs = [i | (i, x) <- zip [0..] xs, pred x]

这里的(i, x) 是一个二元组,其中i 是一个(从零开始的)索引,x 是来自xs 的一个元素。因此,我们过滤pred x,在这种情况下产生索引i

【讨论】:

    【解决方案2】:

    使用zip [0..] xs 获取(索引、元素)元组列表,然后应用您的谓词:)

    findIndices :: (a -> Bool) -> [a] -> [Int]
    findIndices pred xs = [i | (i, x) <- zip [0..] xs, pred x]
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      相关资源
      最近更新 更多