Быстрая функция высшего порядка (церковная пара или минусы) с общими типами параметров, не принимающими типы входных параметров

Я возился с функциональным программированием в Swift 2.1, пытаясь реализоватьЦерковь, кодирующая пару / минусы функция (минусы = λx λy λf f x y в нетипизированном виделямбда-исчисление), который у меня былчитать нельзя было сделать в более ранних версиях Swift.

Сдженерики это выглядит как

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)'

который не работает и выдает ошибку, которую я не могу понять (конечно, список параметров типа (Int, Int) может соответствовать переменным универсального типа (S, T)?)

Если вы избавитесь от универсальных типов и объявите их как все Ints, функция будет работать, но, конечно, мы хотим иметь возможность объединять списки длиннее 2; список из длины 3 состоит, например, из Int с (Int, Int) -> Int.

Другой вариант - напечатать все какAny (увидетьПриведение типов для Any и AnyObject), но я тоже не смог сделать эту работу.

Есть ли у вас какие-либо идеи? Это возможно в Swift еще? Я уверен, что есть более простые способы реализацииcons/car/cdr, но меня особенно интересует кодировка Черча, где элементы списка являются аргументами анонимных функций (лямбда-выражения).

Ответы на вопрос(1)

Ваш ответ на вопрос