Haskell - 检查2D列表是否与列具有相同的行数

Joh*_*ohn 4 arrays haskell equality list

[[Int]]在Haskell中有一个2D列表,我想检查两件事:

  1. 列表是否将sam行数作为列
  2. 行是否具有sam数量的元素

例如:

[[1,2,3], [1,55,9]] 与列具有相同的行数 - 此处为2 - 并且每行具有相同数量的元素,即3.

[[1,2], [1,55], [4,7]] 虽然它具有不等数量的行和列,即3r 2c,但每行中的元素数量相同.

又一个例子:

[[1,2], [1,55], [4,7,8]] 既没有与列相同的行数,也没有每行具有相同数量的元素.

实际上第1步包括第2步,我是对吗?

我的尝试:

所以我到目前为止尝试的是:

listIsEqual :: [[Int]] -> Bool
listIsEqual myList = (all (\x -> length x == (length myList)) )
Run Code Online (Sandbox Code Playgroud)

现在我得到以下错误消息:

Couldn't match expected type `Bool' with actual type `[a0] -> Bool'
In the return type of a call of `all'
Probable cause: `all' is applied to too few arguments
In the expression: (all (\ x -> length x == (length myList)))
In an equation for `listIsEqual':
            listIsEqual myList = (all (\ x -> length x == (length myList)))
Run Code Online (Sandbox Code Playgroud)

谁能告诉我问题出在哪里?

还有其他方法可以解决这个问题吗?

ham*_*mar 6

GHC的错误消息并不总是最有帮助的,但在这种情况下,它是正确的.

可能原因:"all"适用于太少的参数

事实上,你忘记了第二个论点all:

listIsEqual myList = all (\x -> length x == length myList) myList
                                                           ^^^^^^
Run Code Online (Sandbox Code Playgroud)

  • @John:这相当于我的解决方案.通常,`all p(map f xs)=== all(p.f)xs`. (3认同)