2012-02-06 13 views
16

मैं हास्केल सीख रहा हूं। मुझे एक बहुत ही बुनियादी सवाल पूछने के लिए खेद है, लेकिन मुझे जवाब नहीं मिल रहा है। मेरे पास एक फंक्शन एफ है:पॉइंटफ्री शैली में लिखना f x = g x x

f x = g x x 

जहां जी 2 तर्कों का पहले से परिभाषित कार्य है। मैं इस पॉइंटफ्री शैली को कैसे लिखूं? संपादित करें: एक लैम्ब्डा अभिव्यक्ति का उपयोग किए बिना।

धन्यवाद

उत्तर

20

fControl.Monad.join साथ लिखा जा सकता है:

f = join g 

समारोह इकाई पर join जब, बिंदु से मुक्त भाव निर्माण के रूप में यह एक बिंदु में परिभाषित नहीं किया जा सकता है इस्तेमाल किया पुरातन में से एक है मुक्त शैली (इसके SKI calculus समकक्ष, SII - ap id id हास्केल में - टाइप नहीं करता है)

+2

मुझे लगता है कि तुम्हारा मतलब 'च = g' – dflemstr

+0

में शामिल होने आप व्याख्या कर सकते हैं क्यों मेरा उत्तर 'प्वाइंट फ्री 'नहीं होगा? मुझे लगता है मुझे एक गलतफहमी है। – pmr

+0

@dflemstr: ओह; मैंने अपना जवाब अपडेट कर लिया है। धन्यवाद! – ehird

9

यह "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 combinators में से एक बुनियादी सेट कर रहे हैं; B,C,K,W एक और कर रहे हैं - आप को रोकने के लिए मिल गया है कहीं(पुन: अपने "कोई लैम्ब्डा अभिव्यक्ति" टिप्पणी):

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

स्टॉपिंग पॉइंट एक संयोजक है। एक उदाहरण 'ι' (iota) संयोजक - 'λf.fSK' है,' एसकेआई 'को तब' एस = ι (ι (ι (ιι)) के रूप में व्यक्त किया जाता है),' के = ι (ι (ιι)) 'और 'मैं = ιι'। यह आधार केवल λ-calculapsus टाइप करने के लिए इतना अनुकूल नहीं है, 'ιι' टाइपशेक भी नहीं करता है। 'यू = λf.fKSK' थोड़ा बेहतर है (मुझे नहीं पता कि इसका नाम क्या है, इसलिए मैं इसे 'यू' को सार्वभौमिक के रूप में बुला रहा हूं); 'एस = यू (यूयू)' और 'के = यूयूयू' – Vitus

+0

@ विटस [हाँ, हाँ] (http://en.wikipedia.org/wiki/Combinatory_logic#One-point_basis)। यह एक * व्यावहारिक * सेटिंग में, मुझे लगता है कि सुविधा का एक सवाल है, जहां * रोकने के लिए। उदाहरण के लिए हास्केल में, यह सुविधाजनक है कि हमारे पास एसकेआई * और * बीसीकेडब्ल्यू संयोजक हैं। –

+1

... भी, 'f = g = << id = id = << g'। –