Estoy trabajando a través del 20 Intermediate Haskell Exercises en este momento, lo cual es un ejercicio bastante divertido. Implica la implementación de varias instancias de las clases de tipos Functor
y Monad
(y funciones que toman Functor
sy Monad
s como argumentos) pero con lindos nombres como Furry
y Misty
para disfrazar lo que estamos haciendo (un código interesante).¿Qué es un esquema general para escribir una función en estilo pointfree?
He estado tratando de hacer algo de esto en un estilo libre de puntos, y me pregunto si hay un esquema general para convertir una definición de punto (?) En una definición libre de puntos. Por ejemplo, esta es la clase de tipos de Misty
:
class Misty m where
unicorn :: a -> m a
banana :: (a -> m b) -> m a -> m b
(las funciones unicorn
y banana
son return
y >>=
, en caso de que no es obvio) y aquí está mi aplicación de apple
(equivalente a flip ap
):
apple :: (Misty m) => m a -> m (a -> b) -> m b
apple x f = banana (\g -> banana (unicorn . g) x) f
partes posteriores de los ejercicios tienen que implemente versiones de liftM
, liftM2
etc. Aquí están mis soluciones:
appleTurnover :: (Misty m) => m (a -> b) -> m a -> m b
appleTurnover = flip apple
banana1 :: (Misty m) => (a -> b) -> m a -> m b
banana1 = appleTurnover . unicorn
banana2 :: (Misty m) => (a -> b -> c) -> m a -> m b -> m c
banana2 f = appleTurnover . banana1 f
banana3 :: (Misty m) => (a -> b -> c -> d) -> m a -> m b -> m c -> m d
banana3 f x = appleTurnover . banana2 f x
banana4 :: (Misty m) => (a -> b -> c -> d -> e) -> m a -> m b -> m c -> m d -> m e
banana4 f x y = appleTurnover . banana3 f x y
Ahora, banana1
(equivalente a liftM
o fmap
) que era capaz de poner en práctica en el estilo pointfree, mediante una definición adecuada de appleTurnover
. Pero con las otras tres funciones he tenido que usar parámetros.
Mi pregunta es: ¿Existe alguna fórmula para convertir definiciones como estas en definiciones sin puntos?
Está conectado a la eliminación de abstracción que haces para convertir expresiones de cálculo lambda en combinadores. También es posible que desee consultar la herramienta independiente [pointfree] (http://hackage.haskell.org/package/pointfree) (también disponible como '@ pl' en [lambdabot] (http://www.haskell.org)./haskellwiki/Lambdabot)). – ehird
[Una discusión relacionada que estaba teniendo con un amigo el otro día] (https://gist.github.com/1507246). Puede que le resulte interesante. – missingfaktor