haskell pointfree

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) .