Função de ordem superior rápida (par de igrejas, também conhecido como contras), com tipos de parâmetros genéricos que não aceitam tipos de parâmetros de entrada
Eu estava brincando com a programação funcional no Swift 2.1, tentando implementar oPar / codificação de igreja função (contras = λx λy λf f x y em sem tipocálculo lambda), que eu tinhaler não pôde ser feito nas versões anteriores do Swift.
Comgenéricos parece
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)'
que não funciona e dá um erro que não consigo entender (certamente a lista de parâmetros do tipo (Int, Int) pode corresponder a variáveis de tipo genéricas (S, T)?)
Se você se livrar dos tipos genéricos e declará-los todos Ints, a função funcionará, mas é claro que queremos poder conspirar juntos listas com mais de 2; consing uma lista de comprimento 3 é consing um Int com um (Int, Int) -> Int, por exemplo.
Outra opção é digitar tudo comoAny
(VejoConversão de tipo para Any e AnyObject), mas também não consegui fazer isso funcionar.
Você tem alguma ideia? Isso já é possível no Swift? Tenho certeza de que existem maneiras mais simples de implementarcons
/car
/cdr
, mas estou especificamente interessado na codificação da Igreja, onde os elementos da lista são argumentos para funções anônimas (lambdas).