非穷举模式错误haskell

时间:2018-02-07 19:43:32

标签: string haskell matching

我正在尝试将用户的输入解析为我的数据类型:

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的那个)的方式有关。

1 个答案:

答案 0 :(得分:3)

您实施的功能是部分功能,并非涵盖所有情况。您需要添加一个catch-all case并返回错误。 为了能够做到这一点,该函数应返回一个允许建模解析失败的类型(如Either Error FProp)。

在我看来,你可以用https://www.nuget.org/packages/Heleonix.Testing.NUnit创建一个更好的解析器。您可能还需要调查许多parsec library