以无点样式写作fx = gxx

use*_*374 16 haskell pointfree

我正在学习Haskell.我很抱歉提出一个非常基本的问题,但似乎无法找到答案.我有一个定义的函数f:

f x = g x x
Run Code Online (Sandbox Code Playgroud)

其中g是已定义的2个参数的函数.我如何写这个免费的风格?编辑:不使用lambda表达式.

谢谢

ehi*_*ird 20

f可以写成Control.Monad.join:

f = join g
Run Code Online (Sandbox Code Playgroud)

join关于函数monad是构造无点表达式时使用的原语之一,因为它无法在无点样式本身中定义(它的SKI演算等价,SII- ap id id在Haskell中 - 不键入).

  • 我想你的意思是`f =加入g` (2认同)
  • `join`等于`flip ap id`,所以可以说它不是原始的.请注意,虽然某些SKI表达式没有键入,但它们通常不是唯一的,有时替代方案会做得更好.例如,`I = SKK = SKS`,但只有那两个`ap const const`具有你想要的类型. (2认同)
  • @misterbee它在[Control.Monad.Instances]中声明(http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Control-Monad-Instances.html). (2认同)

Wil*_*ess 9

这被称为"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
Run Code Online (Sandbox Code Playgroud)

S,K,我是一组基本的组合器; B,C,K,W是另一个 - 你必须停在某个地方 (re:你的"没有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
-}
Run Code Online (Sandbox Code Playgroud)

  • 停止点是一个组合子.一个例子是`ι`(IOTA)组合子 - `λf.fSK`,`SKI`然后表示为`S =ι(ι(ι(ιι)))`,`K =ι(ι(ιι)) `和`I =ιι`.对于简单的类型化的λ演算,这个基础不是那么友好,"ιι"甚至没有进行类型检查.`U =λf.fKSK`好一点(我不知道它是否有名字,所以我只是称它为'U`为通用); `S = U(UU)`和`K = UUU` (2认同)