Нужна помощь в написании опоры для blak :: Sudoku → [Pos] (Haskell) - PullRequest
2 голосов
/ 29 ноября 2010

Я наткнулся на эту тему Понимание списка Haskell И сейчас я пытаюсь написать для него реквизит, в котором говорится, что все ячейки в этой функции на самом деле пустые, но только дошли до следующего сообщения об ошибке при попытке его скомпилировать.

{-
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 pair в первом аргументе '(rows) bankey (' columns sud) '

Редактировать

Мой вопрос: список, который я получаю из пробелов, представляет собой список [Pos], содержащий [(Nothing, Nothing), (Nothing, Nothing) ... и т. Д.).

Я хочу проверить, что все кортежи обоих элементов на самом деле являются «Nothing», то есть все элементы в [Pos] равны (Nothing, Nothing). Как я могу это проверить, Может кто-нибудь написать пример кода, я не очень хорош в синтаксисе haskell.

Редактировать 2

Вот пример содуку

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 Ответ

4 голосов
/ 29 ноября 2010

Я не уверен, что именно вам нужно, поэтому я скажу вам, что означает ошибка компилятора.

fst работает с кортежами (a, b), но вы даете ему [Pos].

Либо убедитесь, что pair возвращает кортеж, либо используйте функции списка для извлечения первого и второго элемента, например, 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)
...