如何检查 Haskell 中自定义数据类型列表的长度?
How can I check that the length of a list of custom data types in Haskell?
我正在制作一个仅使用 9 x 9 网格的简单数独程序。为此,我有一个功能来检查它是 9 x 9,还检查以确保输入的值是 Just Num
。
这是我找到的最接近的解决方案,我认为问题出在我认为的模式匹配中(如果我错了请纠正我),这是因为它编译但有返回的逻辑错误当给定一个完美的测试用例时,错误不是正确的。无论如何,这是代码转储:D
type Cell = Maybe Int
type Row = [Cell]
data Sudoku = Sudoku [Row]
deriving ( Show, Eq )
rows :: Sudoku -> [Row]
rows (Sudoku ms) = ms
isSudoku :: Sudoku -> Bool
isSudoku (Sudoku [[cs]]) = length [cs] == 9 && length cs == 9
isSudoku (Sudoku _) = False
非常感谢您提供的任何建议!
[x]
作为一种模式只会匹配单例列表(列表中只有一个元素)。
要执行嵌套列表检查,请执行
isSudokuList cs = length cs == ... &&
and [length c == ... | c <- cs]
当然,您必须对其进行调整以适合您的类型。
你也可以定义
niner [a,b,c,d,e,f,g,h,i] = True
.......
并使用它。
我正在制作一个仅使用 9 x 9 网格的简单数独程序。为此,我有一个功能来检查它是 9 x 9,还检查以确保输入的值是 Just Num
。
这是我找到的最接近的解决方案,我认为问题出在我认为的模式匹配中(如果我错了请纠正我),这是因为它编译但有返回的逻辑错误当给定一个完美的测试用例时,错误不是正确的。无论如何,这是代码转储:D
type Cell = Maybe Int
type Row = [Cell]
data Sudoku = Sudoku [Row]
deriving ( Show, Eq )
rows :: Sudoku -> [Row]
rows (Sudoku ms) = ms
isSudoku :: Sudoku -> Bool
isSudoku (Sudoku [[cs]]) = length [cs] == 9 && length cs == 9
isSudoku (Sudoku _) = False
非常感谢您提供的任何建议!
[x]
作为一种模式只会匹配单例列表(列表中只有一个元素)。
要执行嵌套列表检查,请执行
isSudokuList cs = length cs == ... &&
and [length c == ... | c <- cs]
当然,您必须对其进行调整以适合您的类型。
你也可以定义
niner [a,b,c,d,e,f,g,h,i] = True
.......
并使用它。