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中 - 不键入)
这被称为"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)