我正在为Swift中的解析器组合系统编写代码,作为理解它们的练习,但我在Swift中不断遇到泛型问题,可能是因为我不完全理解它们。我将描述错误,但首先是一些背景知识。在我的代码中,Parser
只是一个类型别名:
typealias Parser<T> = (String) -> (output: [T], remainder: String)?
本质上,解析器接受输入,然后返回:
nil
。演示我的问题的代码如下:
struct Op {
}
func lineOfCode() -> Parser<Op> {
return { input in
return nil
}
}
func program() -> Parser<Op> {
return { input in
return anyNumber(of: lineOfCode())
}
}
现在,有一些无用的代码,但问题在于return
方法生成的解析器的program()
语句。它显示以下错误:
Cannot convert call result type '(String) -> (output: [_], remainder: String)?' to expected type '(output: [Op], remainder: String)?'
为了完整性,anyNumber(of:)
方法是一个解析器生成器,它产生一个解析器,它实际上是输入解析器的0 ... *。它的签名是:
anyNumber<T>(of parser: @escaping Parser<T>) -> Parser<T>
我非常感谢对我这个具体问题的任何见解,因为这个错误对我来说非常神秘,我无法找到我应该做的事情,即这个&#34;下划线类型&#34 ;这对我来说很神秘。
答案 0 :(得分:3)
我在program
中扩展了代码并找到了问题的根源:
func program() -> Parser<Op> {
return { input in
let anyNum = anyNumber(of: lineOfCode())
return anyNum
}
}
错误现在说:
无法转换类型'(String)的返回表达式 - &gt; (输出:[Op],余数:字符串)?'返回类型'(输出:[Op],余数:字符串)?'
现在更清楚了不是它!
anyNumber
返回Parser<T>
。您希望在闭包中返回anyNumber
的返回值。但是,此闭包的返回类型不是Parser<T>
。它是(output: [Op], remainder: String)?
。输入不匹配!
我想你想这样做呢?
func program() -> Parser<Op> {
return anyNumber(of: lineOfCode())
}