Эти участки кода отношение к моей проблеме:Неполный ошибка в функции
type Pos = (Int, Int)
type Block = [Maybe Int]
type Sudoku = [[Maybe Int]]
blank :: Sudoku -> Pos
blank sud = let k = ((whichRow sud) -1) in
let n = ((whereIsNothing (head (drop (k-1) (rows sud)))) -1) in
(k, n)
whichRow :: Sudoku -> Int
whichRow sud = whichRow' sud 0
where
whichRow' (Sudoku []) i = i
whichRow' (Sudoku (r:rs)) i = if isNothingPresent r
then 1
else whichRow' (Sudoku rs) (i+1)
whereIsNothing :: Block -> Int
whereIsNothing (x:xs) = if x == Nothing then 1 else 1 + whereIsNothing xs
isNothingPresent :: Block -> Bool
isNothingPresent b = not (Nothing `notElem` b)
То, что я хочу сделать здесь, чтобы, с пустым, возвращающий позицию в Sudoku, который пуст (Значение его элемент ничего). Так как принято начинать считать с 0, это то, что делает -1 в пустой функции. Тип (Int, Int)
представляет (номер строки, номер элемента). В какой строке есть пустая ячейка, а какой из элементов в этой строке содержит пустую ячейку.
Если я запустил это с помощью «пустой» ячейки в первой строке, я получаю ожидаемый результат. Если, однако, пустая ячейка находится в другом месте, чем в первой строке, я получаю неисчерпаемую ошибку. Довольно уверен, что функция wheressNothing является причиной этого, нет базовой базы. Я просто не могу понять, как его решить. Есть идеи?
редактировать: Когда я пишу действительное решение судоку и изменяет значение во 2-й строке в настоящее время, я получаю сообщение об ошибке:
*Main> blank example2
(0,*** Exception: Sudoku.hs:166:1-73: Non-exhaustive patterns in function whereIsNothing
Так где функция должна возвращать первую цифру в качестве 1, он возвращает его как ноль.
'whereIsNothing': Что произойдет, если список пуст? Btw, 'isNothingPresent' просто' any (== Nothing) '. – Zeta
@Zeta Я попытался создать свою пустую функцию таким образом, что whereIsNothing будет вызван, только если ничего не было. Я не уверен, как обработать пустой список в качестве аргумента для этой функции. – Rewbert
@ Rewbert вы можете изменить 'whereIsNothing :: Block -> Maybe Int', а затем * вытянуть * все это до конца (вы увидите, что большинство ваших функций действительно частичны - например, как« пустым »вернуть что-либо, когда нет * пусто * поле осталось?) * ~ Luke ~: Пусть типы вас ведут! * – Carsten