Haskell类型错误 - 无法将预期类型“a”与实际类型“RE a”匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell类型错误 - 无法将预期类型“a”与实际类型“RE a”匹配相关的知识,希望对你有一定的参考价值。

所以我有以下几行......

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

你的第一个代码块有两个叫做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并回馈rfirstMatches应该得到另一个论点吗?

以上是关于Haskell类型错误 - 无法将预期类型“a”与实际类型“RE a”匹配的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 加速复制矩阵

将 SwiftUI 中的文本与背景属性相结合会产生错误,因为无法将“某些视图”类型的值转换为预期的参数类型“文本”?

错误:无法将类型“(_)->()”的值转换为预期的参数类型“(()-> Void)?”

Haskell 打印阶乘

将函数作为参数传递错误:无法将类型“someType.type”的值转换为预期的参数类型“someType”

SwiftUI 错误修复“无法将 'Binding<int>' 类型的值转换为预期类型 'Binding<_>?'”