gpt4 book ai didi

list - 过滤列表列表中的元组 [Haskell]

转载 作者:行者123 更新时间:2023-12-03 02:53:19 26 4
gpt4 key购买 nike

我有一个元组列表的列表:

let list = [[(1,(2,2)),(0,(3,2)),(0,(4,2))],[(0,(2,3)),(0,(3,3)),(0,(4,3))],[(0,(2,4)),(0,(3,4)),(0,(4,4))]]

我想通过每个元组的第一个值来过滤它们。这就是我尝试过的...

compute :: Matrix -> Coordinates -> Matrix
compute m (x,y) = filter (\(a,(_,_)) -> a /= 1) [row | row <- list]

type Matrix = [[Int]]
type Coordinates = (Int, Int)

这是我得到的错误:

ContiguousRegion.hs:20:36:
Couldn't match expected type ‘[Int]’
with actual type ‘(Integer, (t0, t1))’
In the pattern: (a, (_, _))
In the first argument of ‘filter’, namely
‘(\ (a, (_, _)) -> a /= 1)’
In the expression:
filter
(\ (a, (_, _)) -> a /= 1) [row | row <- checkAround m (x, y)]

ContiguousRegion.hs:20:58:
Couldn't match type ‘(Int, (Int, Int))’ with ‘Int’
Expected type: [Int]
Actual type: [(Int, (Int, Int))]
In the expression: row
In the second argument of ‘filter’, namely
‘[row | row <- checkAround m (x, y)]’
Failed, modules loaded: none.

我该如何解决这个问题?谢谢!

最佳答案

让我们采取一些步骤来简化 compute函数并找出问题:

  1. 首先,[row | row <- list]不执行任何操作,相当于 list ,因此我们可以将其删除并替换为 list ,使函数更易于阅读:

    compute m (x,y) = filter (\(a,(_,_)) -> a /= 1) list

    顺便说一下,在你的消息中我看到list并不是过滤器参数的实际名称。相反,它是 checkAround m (x, y) ,所以compute大概应该是这样的:

    compute m (x,y) = filter (\(a,(_,_)) -> a /= 1) $ checkAround m (x, y)
  2. 您传递给 filter 的函数不必要的复杂,我们可以将其替换为 \(a,_) -> a /= 1甚至 (/=1) . fst以减少噪音。这样做给我们带来了:

    compute m (x,y) = filter ((/=1) . fst) list
  3. 我想说现在更容易看到问题了。您的list类型为 [[(Int, (Int, Int))]] , IE。它是元组列表的列表。

    但是你传入的谓词 filter期待一个元组,因此 filter本身需要一个元组列表。

    这是明显的类型不匹配。我们如何解决这个问题?我不知道,这取决于你,但我猜你想过滤内部列表。

    我们如何做到这一点?好吧,我们需要遍历每个内部列表,过滤它们并将过滤后的列表放入新列表中。这正是map (或fmap)可以帮助我们。让我们将构建的过滤器映射到 list :

    compute m (x,y) = map (filter ((/=1) . fst)) list
  4. 不幸的是,上面仍然给我们一个类型错误:

    Couldn't match type ‘(Integer, (Integer, Integer))’ with ‘Int’
    Expected type: [[Int]]
    Actual type: [[(Integer, (Integer, Integer))]]

    嗯,这是为什么呢?我们知道Actual type类型为list以及过滤列表的类型,但是 Expected type 是什么?为什么是 [[Int]]

    答案就在你的类型签名中,Matrix -> Coordinates -> Matrixcompute应该生成 Int 列表的列表s,但我们过滤的内容有些不同。

此时我真的不知道你想做什么,所以我就到此结束,但我怀疑你要么需要更改 compute的类型签名,或者您需要以某种方式合并 m使用过滤后的结果创建一个新的矩阵。

关于list - 过滤列表列表中的元组 [Haskell],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com