Быстрая функция высшего порядка (церковная пара или минусы) с общими типами параметров, не принимающими типы входных параметров
Я возился с функциональным программированием в 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
, но меня особенно интересует кодировка Черча, где элементы списка являются аргументами анонимных функций (лямбда-выражения).