在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)]
这在swift中根本不可能吗?如果有其他方法来实现这种行为?
更新:现在swift 3中似乎支持泛型类型 https://github.com/apple/swift/blob/master/CHANGELOG.md
答案 0 :(得分:38)
从Swift 3.0开始,可以使用Generic typealias
。这应该适合你:
typealias Parser<A> = (String) -> [(A, String)]
用法(来自@Calin Drule评论):
func parse<A>(stringToParse: String, parser: Parser)
答案 1 :(得分:35)
typealias
目前无法与泛型一起使用。您最好的选择可能是将解析器函数包装在结构中。
struct Parser<A> {
let f: String -> [(A, String)]
}
然后,您可以在创建解析器时使用尾随闭包语法,例如
let parser = Parser<Character> { string in return [head(string), tail(string)] }
答案 2 :(得分:0)
这里我将介绍 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
答案 3 :(得分:0)
状态:已实施(快速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)