Haskell:从元组中删除成员

时间:2015-03-26 20:35:29

标签: haskell tuples sudoku

我正在尝试在Haskell中创建一个Sudoku解算器,并且在编写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 5 2 [(2, [1,5,7]), (26, [1,5,8])]”调用delV时,我得到了 “[[1,7],[1,5,8]]”但所需的输出为“[(2, [1,7]), (26, [1,5,8])]”。虽然唯一的区别是在输出中包含索引,但我需要这种格式。附:当前版本的delV无法编译,在我尝试修复它时,我已经打破了它。

EDITED:这是一个版本的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 个答案:

答案 0 :(得分: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
相关问题