2

我偶然发现了这个线程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 对中的第一个参数'(行)bankey('行sud)'

编辑

我的问题是,我从空白中得到的列表是一个列表 [Pos],其中包含 [(Nothing,Nothing),(Nothing,Nothing)...etc]。

我想检查两个元素的所有元组实际上都是“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 )
4

1 回答 1

4

我不确定你到底需要什么,所以我会告诉你编译器错误是什么意思。

fst对 tuples 进行操作(a, b),但你给它一个[Pos].

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

在我看来,您想pair返回一个元组,但这并没有真正发生。blanks sud正在返回Pos.


编辑:好的,所以 aPos是一个元组,你想检查 a 是否[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)
于 2010-11-29T10:46:16.223 回答