gpt4 book ai didi

Swift 泛型导致解析器组合器代码出现问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:29:40 25 4
gpt4 key购买 nike

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

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

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

  1. 一个包含输出项数组和输入的未解析剩余部分的元组,或者
  2. 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>

我非常感谢对我非常具体的问题的任何见解,因为这个错误对我来说非常神秘,我无法找出我应该做的事情,即这个对我来说很神秘的“下划线类型”。

最佳答案

我扩展了 program 中的代码并找到了问题的根源:

func program() -> Parser<Op> {
return { input in
let anyNum = anyNumber(of: lineOfCode())
return anyNum
}
}

现在的错误是:

cannot convert return expression of type '(String) -> (output: [Op], remainder: String)?' to return type '(output: [Op], remainder: String)?'

现在清楚多了,不是吗!

anyNumber返回 Parser<T> .你要返回anyNumber的返回值在闭包中。然而,这个闭包的返回类型不是 Parser<T> .是(output: [Op], remainder: String)? .类型不匹配!

我想你想改为这样做?

func program() -> Parser<Op> {
return anyNumber(of: lineOfCode())
}

关于Swift 泛型导致解析器组合器代码出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40978775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com