在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 3 https://github.com/apple/swift/blob/master/CHANGELOG.md现在支持泛型类型.
str*_*nik 48
typealias从Swift 3.0开始可以使用Generic .这应该适合你:
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
用法(来自@Calin Drule评论):
func parse<A>(stringToParse: String, parser: Parser) 
Ivi*_* M. 36
typealias目前无法与泛型一起使用.您最好的选择可能是将解析器函数包装在结构中.
struct Parser<A> {
    let f: String -> [(A, String)]
}
然后,您可以在创建解析器时使用尾随闭包语法,例如
let parser = Parser<Character> { string in return [head(string), tail(string)] }
状态:已实施(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)