2012-05-30 36 views
7

उल्टा करने के लिए मैं एक लैम्ब्डा \x f -> f x रहा है जो किसी foldM आपरेशन, जहां x एक मूल्य और f :: a -> b है में इस्तेमाल किया जा रहा है।हास्केल समारोह समारोह कॉल

क्या कोई अंतर्निहित कार्य है जो यह करता है?

मैं

foldM (\x f -> f x) ... 

जगह ले सकता है कुछ f'

foldM f' ... 

मैंने सोचा था कि flip इस करना होगा साथ है, लेकिन यह तीन तर्कों (flip :: (a -> b -> c) -> b -> a -> c)

लेता है यह शायद |> के समान है एफ # में

उत्तर

20

आप flip id या flip ($) का उपयोग कर सकते हैं (($) फ़ंक्शन के लिए केवल एक विशेष id है):

Prelude> flip id 3 (+2) 
5 
Prelude> flip ($) 7 (>10) 
False 

यह आंशिक आवेदन का एक दिलचस्प इस्तेमाल होता है: id f xf के साथ एक समारोह में किया जा रहा सिर्फ f x है। जाहिर है, यह भी(flip id) x f जैसा है, इसलिए flip id वह कार्य है जिसे आप ढूंढ रहे हैं।

यदि आप साहसी महसूस करते हैं, तो flip id या flip ($) मैन्युअल रूप से प्रकार का उपयोग करने का प्रयास करें। यह मजेदार है :)

+0

वाह, मुझे कागज और कलम के साथ लगभग 5 मिनट लग गए, यह पता लगाने के लिए कि कैसे 'आईडी'' ए -> ए 'हस्ताक्षर किसी भी तरह से' फ्लिप 'पर कुछ' > बी -> सी'। यह थोड़ा सा जा रहा लायक हो सकता है! – Ashe

+1

@ लेन: यह देखने के बाद स्पष्ट हो जाता है कि जब फ़ंक्शंस पर लागू होता है, तो 'आईडी' '($)' –

+0

जैसा ही होता है यह बहुत सच है! मेरे लिए "ए-हा" पल यह महसूस कर रहा था कि मुझे 'a -> b -> c' को 'a -> (b -> c)' के रूप में देखना चाहिए, और उसके बाद उसे 'id'' एस 'ए' -> ए 'और पाया कि' ए = ए '= (बी -> सी) '-मैं धैर्य में मतभेदों पर बहुत अधिक देख रहा था और इसे पिछले नहीं कर सका। – Ashe

8

हां, इसे flip :: (a -> b -> c) -> b -> a -> c कहा जाता है, उदा। flip (>) 3 5 == True। हैकेज पर अधिक जानकारी और स्रोत: flip

आप जो चाहते हैं वह फ़ंक्शन एप्लिकेशन के तर्कों को दूर करने के लिए है, है ना? ठीक है, चूंकि ($) फ़ंक्शन का उपयोग करके फ़ंक्शन एप्लिकेशन है, तो आप flip ($) :: b -> (b -> c) -> c लिख सकते हैं। चलो देखते हैं कि क्या होता है। यहाँ दो प्रस्तावना कार्यों के लिए स्रोत है:

-- from Hackage: 
($)      :: (a -> b) -> a -> b 
f $ x     = f x 

-- from Hackage: 
flip     :: (a -> b -> c) -> b -> a -> c 
flip f x y    = f y x 

तो, मूल रूप से यदि आप एक साथ प्रकार रखा, flip ($) हो जाता है

flip ($) :: 
    b  -> -- type of x, argument of y and second argument of ($) 
    (b -> c) -> -- type of y, function applied by ($) as its first argument 
    c  -> -- result of the application "y x" 

आप कार्यों की वास्तविक परिभाषा का पालन करें:

flip ($) = (\f x y -> f y x) ($) -- from flip's def. 
     = \x y -> ($) y x   -- partial application 
     = y x      -- from ($)'s def. 
संबंधित मुद्दे