需要帮助写道道支持blak :: Sudoku→[Pos](Haskell)

时间:2010-11-29 10:37:17

标签: haskell ghci

我偶然发现了这个帖子Haskell List Comprehension我现在正试图为它写一个道具,说明这个函数中的所有单元格实际上都是空白的,但是在尝试编译时只得到了以下错误消息它

{-
Property that states that all cells in the blanks list are actually blank
-}
prop_blank_pos :: Sudoku →  Bool
prop_blank_pos sud = (rows sud) !! (fst pair) !! (snd pair) ≡ Nothing
   where pair = blanks sud

无法匹配预期类型'(a,b)'与推断类型'[Pos]' 在第一个参数'fst''namley对和'(!!)'namley fst对中的第二个 在'(rows)bankey('rows sud)'的第一个参数中

修改

我的问题是,我从空白处获得的列表是包含[(Nothing,Nothing),(Nothing,Nothing)......等的列表[Pos]。

我想检查所有元组的元素实际上都是“Nothing”,即[Pos]中的所有元素都是(Nothing,Nothing)。我该如何检查,任何人都可以编写代码示例,我不擅长haskell语法。

编辑2

这是一个soduku的例子

example :: Sudoku
  example =
    Sudoku
      [ [Just 3, Just 6, Nothing,Nothing,Just 7, Just 1, Just 2, Nothing,Nothing]
      , [Nothing,Just 5, Nothing,Nothing,Nothing,Nothing,Just 1, Just 8, Nothing]
      , [Nothing,Nothing,Just 9, Just 2, Nothing,Just 4, Just 7, Nothing,Nothing]
      , [Nothing,Nothing,Nothing,Nothing,Just 1, Just 3, Nothing,Just 2, Just 8]
      , [Just 4, Nothing,Nothing,Just 5, Nothing,Just 2, Nothing,Nothing,Just 9]
      , [Just 2, Just 7, Nothing,Just 4, Just 6, Nothing,Nothing,Nothing,Nothing]
      , [Nothing,Nothing,Just 5, Just 3, Nothing,Just 8, Just 9, Nothing,Nothing]
      , [Nothing,Just 8, Just 3, Nothing,Nothing,Nothing,Nothing,Just 6, Nothing]
      , [Nothing,Nothing,Just 7, Just 6, Just 9, Nothing,Nothing,Just 4, Just 3]
      ]

编辑3 这是如何定义数独的

data Sudoku = Sudoku { rows :: [[Maybe Int]] }
 deriving ( Show, Eq )

1 个答案:

答案 0 :(得分:4)

我不确定你需要什么,所以我会告诉你编译器错误意味着什么。

fst对元组(a, b)进行操作,但您给它[Pos]

要么确保pair返回一个元组,要么使用list函数来获取第一个和第二个元素,例如:第一个head pair,第二个元素pair !! 1

在我看来,你希望pair返回一个元组,但事实并非如此。 blanks sud正在返回Pos列表。


编辑:好的,所以Pos是一个元组,你想检查一个[Pos]是否只包含等于(Nothing, Nothing)的元组。

正如戴夫在评论中所说,要做到这一点,你可以试试all (==(Nothing, Nothing)) the_list之类的东西。如果True的所有元素都等于the_list,则会返回(Nothing, Nothing)

prop_blank_pos :: Sudoku -> Bool
prop_blank_pos sud = all (==(Nothing, Nothing)) (blanks sud)