Writing in pointfree style f x = g x x

前端 未结 3 1678
自闭症患者
自闭症患者 2020-12-06 10:20

I am learning Haskell. I\'m sorry for asking a very basic question but I cant seem to find the answer. I have a function f defined by :

f x = g x x
         


        
3条回答
  •  北荒
    北荒 (楼主)
    2020-12-06 10:49

    This is known as "W" combinator:

    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 are one basic set of combinators; B,C,K,W are another - you've got to stop somewhere (re: your "no lambda expression" comment):

    _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
    -}
    

提交回复
热议问题