我正在尝试将用户的输入解析为我的数据类型:
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))
输入看起来像:“((((((((((((((((((((
当我收到此错误时,似乎一切都很顺利:功能f中的非详尽模式 ¿我可以帮忙解决这个问题吗? 我认为这可能与我定义最后一个递归情况(V的那个)的方式有关。
答案 0 :(得分:3)
您实施的功能是部分功能,并非涵盖所有情况。您需要添加一个catch-all case并返回错误。
为了能够做到这一点,该函数应返回一个允许建模解析失败的类型(如Either Error FProp
)。
在我看来,你可以用https://www.nuget.org/packages/Heleonix.Testing.NUnit创建一个更好的解析器。您可能还需要调查许多parsec library。