详尽的模式错误haskell

我试图解析用户输入到我的数据类型:

type Var = String
data FProp = V Var
            | No FProp
            | Y FProp FProp
            | O FProp FProp
            | Si FProp FProp
            | Sii FProp FProp deriving Read

使用这个函数,通过模式匹配:

f:: [String] -> FProp
f("(":"S":"i":"(":xs) = (Si (let x = fst (span (/= ")") xs) in f x) (let y = snd (span (/= ")") xs) in f y))
f("(":"Y":"(":xs) = (Y (let x = fst (span (/= ")") xs) in f x) (let y = snd (span (/= ")") xs) in f y))
f("(":"S":"i":"i":"(":xs) = (Sii (let x = fst (span (/= ")") xs) in f x) (let y = snd (span (/= ")") xs) in f y))
f("(":"O":"(":xs) = (O (let x = fst (span (/= ")") xs) in f x) (let y = snd (span (/= ")") xs) in f y))
f("(":"N":"O":"(":xs) = (No (f xs))
f ("(":"V":"(":xs) = (V(head xs))

输入将如下所示:“(Si(V(q))(No(V(p))))”(相当于公式:q - >¬p)。

似乎一切都很顺利,当我得到这个错误时: 函数f中的非穷举模式我能得到一些帮助以解决这个问题吗? 我认为这可能与我定义最后一个递归情况(V的情况)的方式有关。


你实现的功能是部分的,并不是所有的情况都包含在内。 你需要添加一个catch-all的情况并返回一个错误。 为了做到这一点,函数应该返回一个允许建模解析失败的类型(比如Either Error FProp )。

在我看来,你可以用parsec库创建一个更好的解析器。 还有很多你可能想要研究的优秀教程。

链接地址: http://www.djcxy.com/p/43285.html

上一篇: exhaustive pattern error haskell

下一篇: Haskell error: non