Ошибка неполных шаблонов

Моя функция принимает в качестве аргумента список Maybe Int. Если элемент = Nothing, он должен напечатать a. и если элемент является Just Int, он напечатает число. Я думал, что захватил базовый вариант, но не думаю, что получил правильный ... Я получаю неполную ошибку шаблона.

replaceValue :: [Maybe Int] -> String
replaceValue (x:xs) 
    | (x:xs) == []        = []
    | isNothing x == True = '.':replaceValue xs
    | isJust x == True    = intToDigit(fromJust x):(replaceValue xs)

Мы будем очень признательны за кивок в правильном направлении! :-)


person Rewbert    schedule 01.10.2014    source источник


Ответы (2)


Шаблон x:xs соответствует только непустому списку. Охранник (x:xs) == [] не может никогда добиться успеха.

Вы, наверное, имели в виду это:

replaceValue [] = []
replaceValue (x:xs)
  | isNothing x = ...
  | isJust    x = ...

Также обратите внимание, что ... == True - это тот же результат, что и просто .... ;-)

person MathematicalOrchid    schedule 01.10.2014

@Mat MathematicalOrchid уже ответил.

Я хочу добавить, что использование isNothing/isJust/fromJust делает ваш код более сложным, чем он должен быть. Кроме того, fromJust в целом опасен, так как он вылетает, если вы передаете ему Nothing - здесь вы правильно предотвращаете это с помощью isJust guard, но это легко забыть в больших программах.

Хорошей новостью является то, что вы можете использовать сопоставление с образцом, чтобы избежать всех этих вспомогательных функций:

replaceValue :: [Maybe Int] -> String
replaceValue []             = []
replaceValue (Nothing : xs) = '.' : replaceValue xs
replaceValue (Just a : xs)  = intToDigit a : replaceValue xs

Как только вы ближе познакомитесь с Haskell, вы сможете переписать стандартные схемы рекурсии, такие как приведенная выше, в более компактной форме, используя несколько библиотечных функций более высокого порядка.

replaceValue :: [Maybe Int] -> String
replaceValue = map (maybe '.' intToDigit)
person chi    schedule 01.10.2014
comment
@Mat MathematicalOrchid и Чи спасибо за ваши ответы, мне очень помогли. :-) Спасибо за советы, они очень помогают новичку! - person Rewbert; 01.10.2014
comment
На самом деле я столкнулся с другой ошибкой. У меня есть тип данных Sudoku :: [[Maybe Int]], у меня есть функция, которая читает текстовый файл, печатает в судоку (все работает нормально) и должна возвращать судоку типа IO, но я понятия не имею, как верни это. Если я напишу return (Судоку, который я получил), я получаю некоторую ошибку, говоря, что ожидаемый тип судоку IO не соответствует фактическому типу судоку. - person Rewbert; 01.10.2014
comment
@Rewbert Откройте другой вопрос и предоставьте фрагмент кода - сложно догадаться, что происходит. - person chi; 01.10.2014