0

我正在尝试实现 Haskell 的标准单词功能。我正在使用 State Monad 来解决问题。

我的代码是:

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))

当我做:

run_word' "guns and roses"

我收到此错误:

Exception: Pattern match failure in do expression

代码在 ghci 中加载,没有任何错误。我究竟做错了什么?

4

1 回答 1

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

x:xs匹配具有至少一个元素的列表(x成为第一个元素,并xs成为列表的其余部分),因此当元组的第三个成员为 时,您会遇到模式匹配失败[]

解决方法:更换

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

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

(并考虑在函数后面使用不同的变量名称:当您有两个或多个同名变量时,它会变得混乱。)

编辑:如果您打开警告(将-Wall标志传递给 ghc/ghci),您将在编译时收到警告,即模式在运行时可能无法匹配。(您还会收到有关让一个xs变量隐藏另一个xs变量的警告,称为阴影。)

于 2013-02-15T19:41:40.807 回答