Swift泛型在解析器组合代码中导致问题

时间:2016-12-05 16:25:02

标签: swift

我正在为Swift中的解析器组合系统编写代码,作为理解它们的练习,但我在Swift中不断遇到泛型问题,可能是因为我不完全理解它们。我将描述错误,但首先是一些背景知识。在我的代码中,Parser只是一个类型别名:

typealias Parser<T> = (String) -> (output: [T], remainder: String)?

本质上,解析器接受输入,然后返回:

  1. 包含输出项数组和未解析的输入的其余部分的元组,或
  2. 如果解析在给定输入上失败,则
  3. nil
  4. 演示我的问题的代码如下:

    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 ;这对我来说很神秘。

1 个答案:

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