这是代码:
import Data.List
data RE sym
= Never -- match no strings
| Empty -- match empty string
| Symbol sym -- match singleton string
| RE sym :+ RE sym -- choice
| RE sym :* RE sym -- concatenation
| Repeat (RE sym) -- repeat zero or more times
| Plus (RE sym) -- repeat one or more times
deriving (Show,Eq)
infixr 6 :+,.+.
infixr 7 :*,.*.
data ABC = A | B | C deriving (Show,Eq,Ord)
编写一个matchEmpty函数,该函数对于与空字符串匹配的正则表达式返回true。
matchEmpty :: RE sym -> Bool
matchEmpty = ???
这就是我写的:
matchEmpty (Empty :+ _) = True
matchEmpty Empty = True
matchEmpty Never = False
matchEmpty (_) = False
matchEmpty(Repeat(_)) = True
但是在某些情况下我仍然出错:
Testing matchEmpty
INCORRECT: A*
wanted: True
got: False
INCORRECT: (A|e)+
wanted: True
got: False
INCORRECT: (AB)*
wanted: True
got: False
我为此迷茫,请帮助我做到这一点,我是Haskell的初学者,请尝试自己学习。 是否需要递归或其他方法来解决此问题?