Haskell: удаление члена из кортежа
Я пытаюсь сделать решение Sudoku в Haskell, и у меня возникают проблемы с созданием функции deleteV, которая удалит значение из списка кандидатов, если соседняя ячейка будет иметь такое же значение. Доска и ячейки определены мной, ниже то, что я имею до сих пор:
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 с "delV 5 2 [(2, [1,5,7]), (26, [1,5,8])]
" Я получил "[[1,7],[1,5,8]]
"но желаемый результат есть"[(2, [1,7]), (26, [1,5,8])]
Msgstr "Хотя единственным отличием является включение индекса в вывод, он мне нужен в этом формате. PS текущая версия delV не компилируется, в моих попытках исправить я сломал ее больше.
Отредактировано: вот версия 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)
1 ответ
У вас есть какой-то неформатированный код, и ваш желаемый результат имеет 7
где, похоже, вы хотели 8
, Я предполагаю, что это то, что вы имели в виду:
import Data.List
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)
где
delV :: Int -> Int -> Board -> [[Int]]
delV 5 2 [(2, [1,5,7]), (26, [1,5,8])] == [[1,7],[1,5,8]]
пока ты хотел
delV :: Int -> Int -> Board -> Board
delV 5 2 [(2, [1,5,7]), (26, [1,5,8])] == [(2, [1,7]), (26, [1,5,8])]
Вы можете просто добавить индексы обратно. Вот что, продолжая ваш стиль:
delV :: Int -> Int -> Board -> Board
delV val sq board =
if board == [] then []
else if isNeighbor (fst(head board)) sq
then (fst(head board), val `delete` snd(head board)):
delV val sq (tail board)
else head board:delV val sq (tail board)
Вот это с точки зрения карты:
delV2 :: Int -> Int -> Board -> Board
delV2 value square = map f
where
f (index, candidates) | isNeighbor index square =
(index, delete value candidates)
f t = t