Swift中的泛型类型

mus*_*afa 54 generics swift

在haskell你可以这样做:

type Parser a = String -> [(a, String)]
Run Code Online (Sandbox Code Playgroud)

我试图在Swift中做类似的事情.到目前为止,我写的这些代码没有运气.

typealias Parser<A> = String -> [(A, String)]
typealias Parser a = String -> [(a, String)]
typealias Parser = String -> [(A, String)]
Run Code Online (Sandbox Code Playgroud)

那么这在快速中根本不可能吗?如果有其他方法来实现这种行为?

更新:似乎swift 3 https://github.com/apple/swift/blob/master/CHANGELOG.md现在支持泛型类型.

str*_*nik 48

typealias从Swift 3.0开始可以使用Generic .这应该适合你:

typealias Parser<A> = (String) -> [(A, String)]
Run Code Online (Sandbox Code Playgroud)

以下是完整的文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/swift/grammar/typealias-declaration

用法(来自@Calin Drule评论):

func parse<A>(stringToParse: String, parser: Parser) 
Run Code Online (Sandbox Code Playgroud)


Ivi*_* M. 36

typealias目前无法与泛型一起使用.您最好的选择可能是将解析器函数包装在结构中.

struct Parser<A> {
    let f: String -> [(A, String)]
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在创建解析器时使用尾随闭包语法,例如

let parser = Parser<Character> { string in return [head(string), tail(string)] }
Run Code Online (Sandbox Code Playgroud)


pka*_*amb 6

通用类型别名 - SE-0048

状态:已实施(Swift 3)

解决方案很简单:允许类型别名引入类型参数,这些参数在其定义范围内。这允许人们表达如下内容:

typealias StringDictionary<T> = Dictionary<String, T>
typealias IntFunction<T> = (T) -> Int
typealias MatchingTriple<T> = (T, T, T)
alias BackwardTriple<T1, T2, T3> = (T3, T2, T1)
Run Code Online (Sandbox Code Playgroud)