Función rápida de orden superior (par de iglesia, también conocido como contras) con tipos de parámetros genéricos que no aceptan tipos de parámetros de entrada
Estaba jugando con la programación funcional en Swift 2.1, tratando de implementar elPar de codificación de iglesia / contras función (contras = λx λy λf f x y en sin tipocálculo lambda), que tuveleer no se pudo hacer en versiones anteriores de Swift.
Congenéricos parece que
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 no funciona y da un error que no puedo entender (¿seguramente la lista de parámetros de tipo (Int, Int) puede coincidir con las variables de tipo genérico (S, T)?)
Si se deshace de los tipos genéricos y los declara todos Ints, la función funciona, pero, por supuesto, queremos poder contrarrestar las listas de más de 2; Una lista de longitud 3 consiste en un Int con un (Int, Int) -> Int, por ejemplo.
Otra opción es escribir todo comoAny
(verTipo de fundición para Any y AnyObject), pero tampoco pude hacerlo funcionar.
¿Tienes alguna idea? ¿Ya es posible en Swift? Estoy seguro de que hay formas más simples de implementarcons
/car
/cdr
, pero estoy específicamente interesado en la codificación de la Iglesia, donde los elementos de la lista son argumentos para funciones anónimas (lambdas).