我一直在尝试在Haskell中创建一个函数,该函数包含一个由列表组成的列表(听起来很简单)我希望这个函数检查输入是否是正确的表( m,n)尺寸。如果不是,则会返回(0,0)
。例如,如果我输入:
[[1,7,2,1],[2,2,7,8],[3,2,0,1]]
我会得到:
(3,4)
我需要此功能来拒绝程序中的无效输入。
答案 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)