String 查找由列表组成的列表的大小

String 查找由列表组成的列表的大小,string,list,haskell,String,List,Haskell,我一直在尝试在Haskell中创建一个函数,该函数的输入是一个由列表组成的列表,并且(听起来可能很简单),我希望该函数检查输入是否是一个具有(m,n)维的正确表。如果不是,它将返回(0,0)。例如,如果我输入: [[1,7,2,1],[2,2,7,8],[3,2,0,1]] 我会得到: (3,4) 我需要这个函数来拒绝程序中的无效输入。首先,为了回答您的实际问题,不要使用(0,0)作为异常结果。函数的类型应为: dim :: [[a]] -> (Int, Int) dim ls = l

我一直在尝试在Haskell中创建一个函数,该函数的输入是一个由列表组成的列表,并且(听起来可能很简单),我希望该函数检查输入是否是一个具有(m,n)维的正确表。如果不是,它将返回
(0,0)
。例如,如果我输入:

[[1,7,2,1],[2,2,7,8],[3,2,0,1]]
我会得到:

(3,4)

我需要这个函数来拒绝程序中的无效输入。

首先,为了回答您的实际问题,不要使用
(0,0)
作为异常结果。函数的类型应为:

dim :: [[a]] -> (Int, Int)
dim ls = let x = length ls
             ys = map length ls
         in case ys of
             h:t -> if all (==h) t then (x, h) else (0, 0)
             [] -> (0, 0)
matrixDim :: [[a]] -> Maybe (Int, Int)
如果矩阵无效,结果将为
。现在首先检查第一个子列表的长度。我假设矩阵必须至少有一行和一列:

matrixDim [] = Nothing
现在您可以使用
可能是单子的事实:

matrixDim (xs:xss) = do
    let w = length xs
    guard (w > 0)
    (w', h) <- matrixDim xss <|> return (w, 0)
    guard (w == w')
    return (w, h + 1)
matrixDim(xs:xss)=do
设w=长度xs
防护罩(w>0)

(w',h)首先,为了回答您的实际问题,不要使用
(0,0)
作为异常结果。函数的类型应为:

matrixDim :: [[a]] -> Maybe (Int, Int)
如果矩阵无效,结果将为
。现在首先检查第一个子列表的长度。我假设矩阵必须至少有一行和一列:

matrixDim [] = Nothing
现在您可以使用
可能是单子的事实:

matrixDim (xs:xss) = do
    let w = length xs
    guard (w > 0)
    (w', h) <- matrixDim xss <|> return (w, 0)
    guard (w == w')
    return (w, h + 1)
matrixDim(xs:xss)=do
设w=长度xs
防护罩(w>0)

(w',h)'length'和'map length'会有帮助。'length'和'map length'会有帮助。当我运行此命令时,我遇到一个错误:在输入'ys'上解析错误。它可以工作。我有一种感觉,当你复制的时候,空间变成了标签,或者一些丢失了……LuQui,我认为这6行代码是不言自明的,但是,我明白你的意思。我们这些仅仅通过查看代码就理解了这段代码的人可能不是它的目标对象:)我在运行这段代码时遇到了一个错误:解析输入“y”上的错误,它可以工作。我有一种感觉,当你复制的时候,空间变成了标签,或者一些丢失了……LuQui,我认为这6行代码是不言自明的,但是,我明白你的意思。我们这些仅仅通过查看代码就理解了这段代码的人可能不是它的目标对象:)对于询问者来说可能有点高级。奇怪的是,没有人注意到-这段代码实际上是错误的。试着用
[[1,1],[1,1],[1,1,1]]
运行它,只得到
(2,1)
。这是因为它是递归的,并且以同样的方式威胁列表的末尾和一个错误。对于询问者来说可能有点高级。奇怪的是,没有人注意到-这段代码实际上是错误的。试着用
[[1,1],[1,1],[1,1,1]]
运行它,只得到
(2,1)
。这是因为它是递归的,以同样的方式威胁列表的末尾和错误。