Я пытаюсь сделать решение Sudoku в Haskell, и у меня возникают проблемы с созданием функции deleteV, которая удалит значение из списка кандидатов, если соседняя ячейка имеет то же значение. Совет директоров и клетки оба определены мною ниже, что я до сих пор:Haskell: Удаление члена из кортежа
type Cell = (Int, [Int])
type Board = [Cell]
rowNo sq = sq `div` 9
colNo sq = sq `mod` 9
boxNo sq = (sq `div` 9 `div` 3) * 3
+ (sq `div` 3) `mod` 3
-- Two squares sq1 and sq2 are in the same neighborhood if their row,
-- column, or box numbers are the same.
isNeighbor sq1 sq2 =
((rowNo sq1) == (rowNo sq2)) ||
((colNo sq1) == (colNo sq2)) ||
(((boxNo sq1) == (boxNo sq2)))
delV val sq board =
if board == [] then []
else if isNeighbor (fst(head board)) sq -- then delV val sq (tail board)
then (val `delete` snd(head board)):(delV val sq (tail board))\
я могу получить Д.Э.Л.В сделать часть того, что он должен, но не все. Когда я вызываю delV с «delV 5 2 [(2, [1,5,7]), (26, [1,5,8])]
», я получаю «[[1,7],[1,5,8]]
», но желаемый результат «[(2, [1,7]), (26, [1,5,8])]
». Хотя единственное различие заключается в включении индекса в выходной файл, мне он нужен в этом формате. Постскриптум текущая версия delV не компилируется, в моих попытках ее исправить я сломал ее больше.
Редакция: Вот версия Д.Э.ЛОВ, которая возвращает «[[1,7],[1,5,8]]
», который является правильным, но не включает в себя индекс:
delV val sq board =
if board == [] then []
else if isNeighbor (fst(head board)) sq then val `delete` snd(head board):delV val sq (tail board)
else (snd(head board)):delV val sq (tail board)
'delete' от' Data.List'. –
Благодарим вас за ответ, я проверю его как можно скорее и сообщит, решит ли он проблему. – CSjunkie