У меня есть следующий код:
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
функцию
Я, вероятно, упускать из виду что-то действительно очевидное, но я просто не могу понять, почему шаблонное совпадение не сработает, я надеюсь, что кто-то сможет помочь. Заранее спасибо!