haskell - Escribiendo en estilo pointfree fx=gxx
(2)
Estoy aprendiendo Haskell. Lo siento por hacer una pregunta muy básica pero parece que no puedo encontrar la respuesta. Tengo una función f definida por:
f x = g x x
donde g es una función ya definida de 2 argumentos. ¿Cómo escribo este estilo pointfree? Edición: sin utilizar una expresión lambda.
Gracias
Esto se conoce como combinador "W" :
import Control.Monad
import Control.Monad.Instances
import Control.Applicative
f = join g -- = Wg (also, join = (id =<<))
= (g `ap` id) -- /x -> g x (id x) = SgI
= (<*> id) g -- = CSIg
= g =<< id -- /x -> g (id x) x
= id =<< g -- /x -> id (g x) x
S, K, I son un conjunto básico de combinadores; B, C, K, W son otra: tienes que detenerte en algún lugar (en relación con: tu comentario "sin expresión lambda") :
_B = (.) -- _B f g x = f (g x) = S(KS)K
_C = flip -- _C f x y = f y x = S(S(K(S(KS)K))S)(KK)
_K = const -- _K x y = x
_W = join -- _W f x = f x x = CSI = SS(KI) = SS(SK)
_S = ap -- _S f g x = f x (g x) = B(B(BW)C)(BB) = B(BW)(BBC)
= (<*>) -- from Control.Applicative
_I = id -- _I x = x = WK = SKK = SKS = SK(...)
{-
Wgx = gxx
= SgIx = CSIgx
= Sg(KIg)x = SS(KI)gx
= gx(Kx(gx)) = gx(SKgx) = Sg(SKg)x = SS(SK)gx
-- _W (,) 5 = (5,5)
-- _S _I _I x = x x = _omega x -- self-application, untypeable
-}
f
se puede escribir con Control.Monad.join
:
f = join g
join
en la función mónada es una de las primitivas utilizadas al construir expresiones sin puntos , ya que no se puede definir en un estilo sin puntos en sí mismo (su equivalente de cálculo SKI , . SII
- ap id id
en Haskell - no escribe)