2015-03-26 4 views
1

Я пытаюсь сделать решение 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) 

ответ

3

У вас есть какой-то Неверный формат код и ваш желаемый результат имеют 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 
+1

'delete' от' Data.List'. –

+0

Благодарим вас за ответ, я проверю его как можно скорее и сообщит, решит ли он проблему. – CSjunkie

Смежные вопросы