我很难理解数独求解器this部分的一部分。我不知道扩展功能如何工作。
expand :: Matrix Choices -> [Matrix Choices]
expand m =
[rows1 ++ [row1 ++ [c] : row2] ++ rows2 | c <- cs]
where
(rows1,row:rows2) = break (any (not . single)) m
(row1,cs:row2) = break (not . single) row
这里发生了什么?简短的解释将非常有用。
答案 0 :(得分:6)
幸运的是,你链接的代码很好地评论了。从上面引用函数:
除了崩溃之外,函数展开的行为方式与崩溃相同 它只会折叠第一个方格而不是一个选择:
直观地,函数expand
采用数独并找到第一个仍然可以选择多个单元格的单元格。然后,它扩展了这个选择,产生了许多具有特定选择的sudokus。也就是说,它(大致)转变:
[ some data ... , [ data, ... [1,2,3] ... data ] , other data ]
到
[[ some data ... , [ data, ... [1] ... data ] , other data ]
,[ some data ... , [ data, ... [2] ... data ] , other data ]
,[ some data ... , [ data, ... [3] ... data ] , other data ]]
关键是这些:
(rows1,row:rows2) = break (any (not . single)) m
此处,row
是第一行,其中有一个单元格具有非单一选择。 rows1,rows2
是数独的前/后行。
(row1,cs:row2) = break (not . single) row
此处,cs
是具有非单一选择的row
的第一个单元格。 row1,row2
是row
中的左/右部分。
答案 1 :(得分:1)
如果有人想知道,
type Matrix a = [a]
type Choices = [Value]
type Value = Char
这是
expand m = [rows ++ ... ++ rows 2 | c <- cs]
其中...
是
[ row1 ++ ([c] : row2) ]
各种局部变量在where
块中定义。换句话说,我们正在搜索输入矩阵并将其分解为一对结果。
如果您的问题是“这一切意味着什么?”,那么坦率地说,我不知道。这段代码不是我所说的“直观”。