详尽的模式错误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