Pergunta

I am trying to implement Standard words function of Haskell. I am using State Monad to solve the problem.

My Code is :

type WorS = ([String],String,String)

words' :: State WorS [String]
words' = do
           (lwords, words, x:xs) <- get
           case x:xs of
           (' ':xs) -> (put (words:lwords, [], xs) >> words')
           ([]) -> return lwords
           (_:xs)-> (put (lwords, words ++ [x], xs) >> words')

run_word' ::  String ->[String]
run_word' x = reverse $ fst (runState words' ([], [], x))

When I do:

run_word' "guns and roses"

I get this error:

Exception: Pattern match failure in do expression

The code is loading in ghci without any error. What am I doing wrong?

Foi útil?

Solução

       (lwords,words,x:xs)<-get

x:xs matches a list with at least one element (x becomes the first element, and xs becomes the rest of the list), so you get a pattern match failure when the third member of the tuple is [].

Solution: replace

       (lwords,words,x:xs)<-get
       case x:xs of

with

       (lwords,words,xs)<-get
       case xs of

(And consider using different variable names later in the function: it gets confusing when you have two or more variables with the same name.)

Edit: if you turn on warnings (pass the -Wall flag to ghc/ghci), you will get warned at compile time that the pattern may fail to match at runtime. (You'll also get a warning about having one xs variable hiding another xs variable, called shadowing.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top