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

时间:2012-11-15 05:40:08

标签: string list haskell

我一直在尝试在Haskell中创建一个函数,该函数包含一个由列表组成的列表(听起来很简单)我希望这个函数检查输入是否是正确的表( m,n)尺寸。如果不是,则会返回(0,0)。例如,如果我输入:

[[1,7,2,1],[2,2,7,8],[3,2,0,1]]

我会得到:

(3,4)

我需要此功能来拒绝程序中的无效输入。

2 个答案:

答案 0 :(得分:6)

首先,要回答您的实际问题,请不要使用(0, 0)作为例外结果。你的函数的类型应该是:

matrixDim :: [[a]] -> Maybe (Int, Int)

如果矩阵无效,结果将为Nothing。现在首先检查第一个子列表的长度。我假设矩阵必须至少有一行和一列:

matrixDim [] = Nothing

现在您可以使用Maybe是monad的事实:

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)

现在让我们回到手头的实际问题:列表列表不是你想要的。这种应用程序的更好的数据类型是其中一个Data.Array.*模块中定义的数组。一个更实验性的替代方案,即免费并行化,是使用repa

答案 1 :(得分: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)