Swift 如何修复无法转换类型Result的值<;SuccessType<;A>;,错误>;关闭结果类型结果<;成功与失败>;敏捷的
我试图映射Swift的结果类型以生成不同类型的新结果,但它不是类型检查,而是抛出错误:Swift 如何修复无法转换类型Result的值<;SuccessType<;A>;,错误>;关闭结果类型结果<;成功与失败>;敏捷的,swift,generics,closures,Swift,Generics,Closures,我试图映射Swift的结果类型以生成不同类型的新结果,但它不是类型检查,而是抛出错误: 错误:无法将类型Result的值转换为闭包结果类型Result 我尝试在结果上使用开关并在.success和.failure上进行匹配,但我得到了类似的类型检查错误。我还尝试过显式地指定输入和返回类型,但没有成功 我已经用我比较熟悉的其他语言(F#和Kotlin)复制了代码,它似乎在那里键入check swift编译器在这一行下显示一个sqiggly: 返回self.apply(input).map{resu
错误:无法将类型Result的值转换为闭包结果类型Result
我尝试在结果上使用开关并在.success和.failure上进行匹配,但我得到了类似的类型检查错误。我还尝试过显式地指定输入和返回类型,但没有成功
我已经用我比较熟悉的其他语言(F#和Kotlin)复制了代码,它似乎在那里键入check
swift编译器在这一行下显示一个sqiggly:
返回self.apply(input).map{result in ParseSuccess(transform(result.data),result.input)}
这个代码哪里出了问题
<代码>导入基础
类ParseError:错误{
让我们犯错误:字符串
init(uerr:String){
self.err=err
}
}
类解析成功{
让数据:A
让输入:子字符串
init(u数据:A,u输入:子字符串){
self.data=数据
self.input=输入
}
}
类解析器{
设fn:(子字符串)->结果
init(fn:@escaping(子字符串)->Result){
self.fn=fn
}
func apply(u输入:子字符串)->结果{
返回self.fn(输入)
}
func映射(u变换:@escaping(A)->B)->解析器{
返回语法分析器{(输入)中的
返回self.apply(input).map{result in
ParseSuccess(转换(result.data),result.input)}
}
}
}
值得一提的是,我相信这可能不是开始编写解析器组合器的最佳方式,但我一直在努力找出我在这里哪里出错了
谢谢在
返回解析器行中使用Paraser
是一种奇怪的行为{
。当泛型类型以其非限定形式被提及时,在泛型类型的声明体中,类型参数被推断为未更改。例如,Array
上的函数可以简单地返回Array
,并且T
隐含为与self的T
的值相同不用说,我不是这种行为的超级粉丝
将其更改为returnparser{…
解决了这个问题
我是这样发现这个问题的。在处理泛型错误时,我总是尝试插入大量类型注释来“固定”数据类型,以确认编译器和我在同一页上
我首先写道:
func map<B>(_ transform: @escaping (A) -> B) -> Parser<B> {
return Parser { (input) in
return self.apply(input).map { result in
let newData: ParseSuccess<B> = transform(result.data)
return ParseSuccess(newData, result.input)
}
}
}
func映射(u变换:@escaping(A)->B)->解析器{
返回语法分析器{(输入)中的
返回self.apply(input).map{result in
let newData:ParseSuccess=transform(result.data)
返回ParseSuccess(newData,result.input)
}
}
}
此时错误更改为:
Untitled 2.swift:32:10: error: cannot convert return expression of type 'Parser<A>' to return type 'Parser<B>'
return Parser { (input) in
^~~~~~~~~~~~~~~~~~~~
Untitled 2.swift:32:10:错误:无法将“Parser”类型的返回表达式转换为返回类型“Parser”
返回语法分析器{(输入)中的
^~~~~~~~~~~~~~~~~~~~
在返回解析器行中使用Paraser
是一种奇怪的行为{
。当泛型类型以其非限定形式被提及时,在泛型类型的声明体中,类型参数被推断为未更改。例如,Array
上的函数可以简单地返回Array
,并且T
隐含为与self的T
的值相同不用说,我不是这种行为的超级粉丝
将其更改为returnparser{…
解决了这个问题
我是这样发现这个问题的。在处理泛型错误时,我总是尝试插入大量类型注释来“固定”数据类型,以确认编译器和我在同一页上
我首先写道:
func map<B>(_ transform: @escaping (A) -> B) -> Parser<B> {
return Parser { (input) in
return self.apply(input).map { result in
let newData: ParseSuccess<B> = transform(result.data)
return ParseSuccess(newData, result.input)
}
}
}
func映射(u变换:@escaping(A)->B)->解析器{
返回语法分析器{(输入)中的
返回self.apply(input).map{result in
let newData:ParseSuccess=transform(result.data)
返回ParseSuccess(newData,result.input)
}
}
}
此时错误更改为:
Untitled 2.swift:32:10: error: cannot convert return expression of type 'Parser<A>' to return type 'Parser<B>'
return Parser { (input) in
^~~~~~~~~~~~~~~~~~~~
Untitled 2.swift:32:10:错误:无法将“Parser”类型的返回表达式转换为返回类型“Parser”
返回语法分析器{(输入)中的
^~~~~~~~~~~~~~~~~~~~
BTW,您的解析错误和成功类型可能更适合表示为结构。在ParseError
的情况下,甚至最好使用enum
,使用离散的案例,而不是不同的err
字符串值。顺便说一句,您的解析错误和成功类型可能更适合表示可表示为结构。在ParseError
的情况下,最好使用enum
,并使用离散的大小写,而不是不同的err
字符串值。