haskell - que - ¿Se han emulado los adverbios de estilo J, las horquillas, etc. a través de las bibliotecas en los lenguajes funcionales principales?
paradigma de programacion funcional pdf (2)
¿La programación tácita no se corresponde con la lógica del combinador o el estilo sin punto en Haskell? Por ejemplo, aunque no conozco a J, de lo que recojo un "fork" traduce tres funciones f
, g
y h
y un argumento x
en una expresión g (fx) (hx)
. La operación de "aplicar múltiples funciones a un solo argumento, luego aplicar los resultados entre sí en secuencia" es una generalización del combinador S de Curry de Schönfinkel y en Haskell corresponde a la instancia Applicative
de la mónada Reader.
Un combinador de fork
en Haskell tal que fork fghx
coincida con el resultado especificado anteriormente tendría el tipo (t -> a) -> (a -> b -> c) -> (t -> b) -> t -> c
. Al interpretar esto como el uso del functor Reader ((->) t)
y reescribirlo para un funtor arbitrario, el tipo se convierte en fa -> (a -> b -> c) -> fb -> fc
. Intercambiar los dos primeros argumentos nos da (a -> b -> c) -> fa -> fb -> fc
, que es el tipo de liftA2
/ liftM2
.
Entonces, para el ejemplo común de calcular el promedio, la bifurcación +/ % #
se puede traducir directamente como flip liftA2 sum (/) (fromIntegral . length)
o, si uno prefiere los combinadores Applicative
infijos, como (/) <$> sum <*> fromIntegral . length
(/) <$> sum <*> fromIntegral . length
Si no es así, ¿hay algún problema técnico que haga esto imposible, o simplemente no vale la pena hacerlo?
Al menos en Haskell, creo que el problema principal es que el estilo extremadamente libre de puntos se considera confuso e ilegible, especialmente cuando se usa la mónada Reader para dividir los argumentos.
¿Se ha intentado alguna vez una emulación del estilo J de programación tácita súper condensada a través de verbos, adverbios, bifurcaciones, etc. a través de bibliotecas para los lenguajes funcionales principales?
Si es así, ¿cuán exitoso fue el resultado?
Si no es así, ¿hay algún problema técnico que haga esto imposible, o simplemente no vale la pena hacerlo?
Me interesan particularmente las construcciones como las horquillas que no parecen corresponder directamente con los conceptos básicos de la programación funcional.
La discusión de Camccann es bastante buena. Pero tenga en cuenta que este estilo ahora da lugar a dos recorridos.
Puede escribir una biblioteca de combinator que combina los recorridos. Consulte aquí: http://squing.blogspot.com/2008/11/beautiful-folding.html
La publicación ofrece el siguiente ejemplo para escribir un medio:
meanF :: Fractional a => Fold a a
meanF = bothWith (/) sumF (after lengthF fromIntegral)
mean :: Fractional a => [a] -> a
mean = cfoldl'' meanF
Además, las publicaciones de seguimiento de Conal Eliott generalizan esto mucho más allá: http://conal.net/blog/posts/enhancing-a-zip/
Sacó el código de sus publicaciones en una biblioteca disponible en hackage: http://hackage.haskell.org/package/ZipFold