Haskell类型错误-无法将期望的类型'a'与实际类型'RE a'相匹配

时间:2018-11-06 21:31:58

标签: haskell

所以我有以下几行...

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)

1 个答案:

答案 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]

  1. 也许您的实现是正确的,并且您打算使用“ firstMatches :: RE r-> [RE r]
  2. 也许您的类型签名是正确的。使RHS与sig类型匹配的一种方法是| (matchEmpty a == True) = []。这个总是返回空列表的函数不是很有用,但是在我们可以使用的范围内没有类型r的值。您是否还有其他需要使用RE r并返回r的功能? firstMatches是否应该再提出一个论点?