Ошибка сопоставления с образцом для допустимого - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующий код:

import Debug.Trace (trace)

mtrace :: Show a => String -> a -> a
mtrace msg value =
  trace (msg ++ show value) value

isVowel :: Char -> Bool
isVowel = (`elem` "AEIOU")

vowelSlice :: String -> ([Maybe Char], String)
vowelSlice "" = ([], [])
vowelSlice (c:s)
    | isVowel c = (Nothing:chars, c:vowels)
    | otherwise = (Just c:chars, vowels)
    where (chars, vowels) = vowelSlice s

stringTogether :: [Maybe Char] -> String -> String
stringTogether [] "" = ""
stringTogehter (Just c:cs) vowels = c:stringTogether cs vowels
stringTogehter (Nothing:cs) (v:vs) = v:stringTogether cs vs

process :: String -> String
process s = stringTogether (mtrace "chars: " chars) (mtrace "vowels: " cycledVowels)
    where
      (chars, vowels) = vowelSlice s
      cycledVowels = tail vowels ++ [head vowels]

main :: IO ()
main = do
    line <- getLine
    putStrLn $ process line

для тестирования Я запускаю свой файл с помощью команды runhaskell, и я ввожу HELLO PEOPLE в качестве пользовательского ввода после запуска программы. Я ожидаю вывод: HELLE POEPLO или что-то подобное, поскольку моя программа предназначена только для смещения гласных. Моя программа работает нормально, пока не попытается запустить метод stringTogether. В частности, проблема заключается в сопоставлении с шаблоном, у меня есть массив:

[Just 'H',Nothing,Just 'L',Just 'L',Nothing,Just ' ',Just 'P',Nothing,Nothing,Just 'P',Just 'L',Nothing]

и шаблон (Just c:cs) vowels, который, как я ожидаю, будет соответствовать, но почему-то он не работает. Когда я запускаю код и ввожу HELLO WORLD, я получаю следующую ошибку: 18:1-25: Non-exhaustive patterns in function stringTogether Я зарегистрировал несколько вещей, используя модуль трассировки, и все выглядит, как и ожидалось, прежде чем войти в stringTogether функцию

Я, вероятно, упускать из виду что-то действительно очевидное, но я просто не могу понять, почему шаблонное совпадение не сработает, я надеюсь, что кто-то сможет помочь. Заранее спасибо!

1 Ответ

3 голосов
/ 30 января 2020

Сбой сопоставления с образцом из-за опечатки, вместо предполагаемой были определены 2 отдельные функции: stringTogether и stringTogehter. Шаблоны были действительны, но компилятор не смог их найти, потому что у них были несовпадающие имена. Технически функция stringTogether имела только один шаблон [] "", поэтому при передаче списка возникла ошибка 18:1-25: Non-exhaustive patterns in function stringTogether.

...