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
Другие вопросы по тегам