Haskell:从元组中删除成员

Haskell:从元组中删除成员,haskell,tuples,sudoku,Haskell,Tuples,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) `

我试图在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做它应该做的部分,但不是全部。 当我用“
delv2[(2[1,5,7]),(26[1,5,8])”
调用delV时,我得到 “
[[1,7],[1,5,8]]
”但所需的输出是“
[(2[1,7]),(26[1,5,8])”
”。虽然唯一的区别是在输出中包含索引,但我需要这种格式的索引。另外,当前版本的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)

您有一些格式错误的代码,并且您想要的输出有一个
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 -> 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

delete
来自
数据。列表
。感谢您的回复,我会尽快测试它,并告诉您它是否解决了问题。
delV2 :: Int -> Int -> Board -> Board
delV2 value square = map f
  where
    f (index, candidates) | isNeighbor index square =
        (index, delete value candidates)
    f t = t