2014-11-23 15 views
43

in Haskell si può fare questo:typealias generici a Swift

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

Ho provato a fare qualcosa di simile a Swift. Finora ho scritto questi codici senza fortuna.

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

Quindi è semplicemente impossibile in rapido? E se è ci sono altri modi per implementare questo comportamento?

UPDATE: Sembra typealiases generici sono ora supportate in rapida 3 https://github.com/apple/swift/blob/master/CHANGELOG.md

risposta

35

typealias momento non può essere utilizzato con i generici. L'opzione migliore potrebbe essere quella di avvolgere la funzione parser all'interno di una struttura.

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

È quindi possibile utilizzare la sintassi della chiusura finale durante la creazione di un parser, ad es.

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

Oh. Boxe. Funziona sempre. Grazie. – mustafa

+0

@mustafa Ciao, potresti dirmi quale parte di esso denota la boxe? Non intendevi la boxe in senso Java, vero? Inoltre, ho un problema che mi avvolge in testa '[testa (stringa) ...' e 'coda (stringa)]'. Grazie. – Unheilig

+1

@Unheilig La boxe si riferisce al wrapping di un tipo attorno ad un altro al fine di sfruttare le funzionalità disponibili solo nel tipo esterno. Si può avere familiarità con il concetto di Objective-C, dove primitive come gli interi non possono essere passate in un NSArray senza essere "inscatolate" in un NSNumber, ad esempio, '@ (1234)'. La cosa testa/coda non è specifica, ma piuttosto un modello comune per dividere un array nel primo oggetto (la testa) e gli elementi rimanenti (la coda). Vedi http://chris.eidhof.nl/posts/swift-tricks.html – clozach

0

Qui sto presentando esempio per typealias che demonistrate a come utilizzare typealias nelle definizioni protocolli: Spero che questo ti aiuta a capire 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 
} 
} 

uscita:

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

Hey @Narendra G Pensi che questa soluzione possa funzionare anche per altri tipi di numeri? – eonist

Problemi correlati