Swift Funktion höherer Ordnung (Church Pair aka Cons) mit generischen Parametertypen, die keine Eingabeparametertypen akzeptieren
Ich habe mit der funktionalen Programmierung in Swift 2.1 rumgespielt und versucht, das @ zu implementiereChurch Codierungspaar / Nachteile function cons = λx λy λf f xy in untypisiertem Lambda-Kalkül), die ich hattelese konnte in früheren Versionen von Swift nicht ausgeführt werden.
Mit generics es sieht aus wi
func cons<S,T,U>(x:S,_ y:T) -> ((S,T) -> U) -> U
{
return { (f:((S,T) -> U)) -> U in return f(x,y)}
}
cons(1,2)
//error: cannot invoke 'cons' with an argument list of type '(Int, Int)'
//note: expected an argument list of type '(S, T)'
was funktioniert nicht und gibt einen Fehler, den ich nicht verstehen kann (sicherlich kann die Parameterliste des Typs (Int, Int) mit generischen Typvariablen (S, T) übereinstimmen?)
Wenn Sie die generischen Typen loswerden und alle Ints deklarieren, funktioniert die Funktion, aber wir möchten natürlich in der Lage sein, Listen länger als 2 zusammenzufassen. Wenn Sie eine Liste der Länge 3 verwenden, wird beispielsweise ein Int mit einem (Int, Int) -> Int verwendet.
Eine weitere Option ist, alles als @ einzugebeAny
(sehenType Casting für Any und AnyObject), aber ich konnte das auch nicht zum Laufen bringen.
Hast du eine Idee? Ist das in Swift schon möglich? Ich bin mir sicher, dass es einfachere Möglichkeiten gibt, @ zu implementierecons
/car
/cdr
, aber ich interessiere mich speziell für die Kodierung in der Kirche, bei der die Listenelemente Argumente für anonyme Funktionen (Lambdas) sind.