Swift中的genericstypes

在haskell中,你可以这样做:

type Parser a = String -> [(a, String)] 

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

 typealias Parser<A> = String -> [(A, String)] typealias Parser a = String -> [(a, String)] typealias Parser = String -> [(A, String)] 

那么,这是不是迅速? 如果是,还有其他的方法来实现这种行为?

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

typealias目前不能用于generics。 你最好的select可能是将parsing器函数包装在一个结构中。

  struct Parser<A> { let f: String -> [(A, String)] } 

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

 let parser = Parser<Character> { string in return [head(string), tail(string)] } 

从Swift 3.0 typealias可以使用generics的typealias 。 这应该为你工作:

 typealias Parser<A> = (String) -> [(A, String)] 

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

在这里,我正在介绍一个用于描述如何在协议定义中使用typealias的typealias示例 :我希望这可以帮助您理解typealias

 protocol NumaricType { typealias elementType func plus(lhs : elementType, _ rhs : elementType) -> elementType func minus(lhs : elementType, _ rhs : elementType) -> elementType } struct Arthamatic :NumaricType { func addMethod(element1 :Int, element2 :Int) -> Int { return plus(element1, element2) } func minusMethod(ele1 :Int, ele2 :Int) -> Int { return minus(ele1, ele2) } typealias elementType = Int func plus(lhs: elementType, _ rhs: elementType) -> elementType { return lhs + rhs } func minus(lhs: elementType, _ rhs: elementType) -> elementType { return lhs - rhs } } 

输出:

  let obj = Arthamatic().addMethod(34, element2: 45) // 79