Подтвердить что ты не робот

Типичные типы в Свифте

В 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

4b9b3361

Ответ 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)