Типичные типы в Свифте
В 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)]
Так просто ли это просто невозможно? И если есть другие способы реализовать это поведение?
ОБНОВЛЕНИЕ: Кажется, что generical typealiases теперь поддерживаются в swift 3
https://github.com/apple/swift/blob/master/CHANGELOG.md
Ответы
Ответ 1
typealias
настоящее время не может использоваться с генериками. Ваш лучший вариант может заключаться в том, чтобы обернуть функцию парсера внутри структуры.
struct Parser<A> {
let f: String -> [(A, String)]
}
Затем вы можете использовать синтаксис замыкающего замыкания при создании парсера, например
let parser = Parser<Character> { string in return [head(string), tail(string)] }
Ответ 2
Общие typealias
могут использоваться начиная с Swift 3.0. Это должно работать для вас:
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)
Ответ 3
Здесь я представляю пример для 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
Ответ 4
Псевдонимы общего типа - 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)