所以我有以下几行...
firstMatches :: RE a -> [a]
firstMatches (a :+: b)
| (matchEmpty a == True) = [a]
其中matchEmpty定义为...
matchEmpty :: RE a -> Bool
matchEmpty Empty = True
matchEmpty (a :+: b)
| matchEmpty a == False = False
| matchEmpty b == False = False
| otherwise = True
我收到错误消息“无法将预期类型'a'与实际类型'RE a'相匹配”
我很确定我没有为matchEmpty提供正确的参数,但我不知道该怎么做
matchEmpty a == False = False
RE定义为
data RE a -- regular expressions over an alphabet defined by 'a'
= Empty -- empty regular expression
| Sym a -- match the given symbol
| RE a :+: RE a -- concatenation of two regular expressions
| RE a :|: RE a -- choice between two regular expressions
| Rep (RE a) -- zero or more repetitions of a regular expression
| Rep1 (RE a) -- one or more repetitions of a regular expression
deriving (Show)
答案 0 :(得分:0)
您的第一个代码块有两个叫做a
的东西。在这里,我替换了变量以避免重复:
firstMatches :: RE r -> [r]
firstMatches (a :+: b)
| (matchEmpty a == True) = [a]
在错误消息中进行相同的替换:
无法将预期类型'r'与实际类型[r]匹配。 “ r”是由firstMatches :: RE r-> [r]
的类型签名绑定的刚性类型变量
您有a :: Re r
,并构造了[a] :: [RE r]
。但是类型签名表明firstMatches
返回[r]
。
| (matchEmpty a == True) = []
。这个总是返回空列表的函数不是很有用,但是在我们可以使用的范围内没有类型r
的值。您是否还有其他需要使用RE r
并返回r
的功能? firstMatches
是否应该再提出一个论点?