gpt4 book ai didi

swift - 在不同模块中定义泛型时无法推断泛型参数

转载 作者:行者123 更新时间:2023-11-28 08:21:52 24 4
gpt4 key购买 nike

我有一个定义了 2 个模块的 swift 存储库:

Sources/Parser/Parser.swift 包含:

public struct Parser<Token, Output> {
public let parse: (AnyCollection<Token>) throws -> (Output, AnyCollection<Token>)
}

public func countingParser() -> Parser<Character,Int> {
return Parser { input in
return ( 1, input.dropFirst( 1 ) )
}
}

Sources/External/Parser.swift 包含:

import Parser

func externalCountingParser() -> Parser<Character,Int> {
return Parser { input in
return ( 1, input.dropFirst( 1 ) )
}
}

为了完整起见,我的 Package.swift 包含:

import PackageDescription

let package = Package(
name: "SwiftBug",
targets: [ Target( name: "External", dependencies: [ "Parser" ] ) ]
)

尽管 countingParserexternalCountingParser 基本上是相同的代码,但我在使用 swift 3.0.1 的 External/Parser.swift 中遇到编译错误.

Sources/External/Parser.swift:4:10: error: generic parameter 'Token' could not be inferred
return Parser { input in
^
Parser.Parser:1:15: note: 'Token' declared as parameter to type 'Parser'
public struct Parser<Token, Output> {
^
Sources/External/Parser.swift:4:10: note: explicitly specify the generic arguments to fix this issue
return Parser { input in
^
<Any, Any>

无论我做什么来进一步指定函数内的 Parser 类型,我都无法编译它。为什么在定义 Parser 的模块内定义时可以正常工作,但在同一模块外定义时无法编译?

编辑:如果我按照下面的建议进行@PEEJWEEJ 的编辑,仍然存在编译错误,但错误消息已更改:

Sources/External/Parser.swift:

import Parser

func externalCountingParser() -> Parser<Character,Int> {
let p: Parser<Character, Int> = Parser<Character,Int>( parse: { input in
return ( 1, input.dropFirst(1) )
} )

return p
}

现在产生错误:

Sources/External/Parser.swift:4:35: error: expression type 'Parser<Character, Int>' is ambiguous without more context
let p: Parser<Character, Int> = Parser<Character,Int>( parse: { input in
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sources/External/Parser.swift 中指定了更多类型信息:

import Parser

func externalCountingParser() -> Parser<Character,Int> {
let p: Parser<Character, Int> = Parser<Character,Int> { (input: AnyCollection<Character>) -> (Int,AnyCollection<Character>) in
return ( 1, input.dropFirst(1) )
}

return p
}

以下诊断结果:

Sources/External/Parser.swift:4:96: error: declared closure result '(Int, AnyCollection<Character>)' is incompatible with contextual type '(_, AnyCollection<_>)'
let p: Parser<Character, Int> = Parser<Character,Int> { (input: AnyCollection<Character>) -> (Int,AnyCollection<Character>) in
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(_, AnyCollection<_>)

最佳答案

问题似乎是 Parser 的默认构造函数默认为 internal。将此归因于另一个错误的诊断消息。

如果我将 struct Parser 的声明更改为:

public struct Parser<Token, Output> {
public typealias ParseFunction = (AnyCollection<Token>) throws -> (Output, AnyCollection<Token>)
public let parse: ParseFunction
public init( parse: @escaping ParseFunction ) {
self.parse = parse
}
}

然后我们编译就好了。

关于swift - 在不同模块中定义泛型时无法推断泛型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41065381/

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