2013-06-02 3 views
13

मैं सोच रहा था कि एक से अधिक तर्क लेने वाले कार्यों के साथ कार्यात्मक रचना करना संभव था। मैं इस तरह की कुछहैकेल में बहु-मूल्यवान कार्यों के साथ कार्यात्मक संरचना?

x = (+3).(*) 

एक फ़ंक्शन के बराबर x सेट करना जो दो संख्याओं के उत्पाद में तीन जोड़ता है।

+4

http://conal.net/blog/posts/semantic-editor-combinators – luqui

+1

[यह] (http://stackoverflow.com/questions/9656797/variadic-compose-function) हो सकता है कि आप जो खोज रहे हैं । – is7s

उत्तर

23

ऐसा करने के कई तरीके हैं, लेकिन वे सब कुछ अजीब हैं।

((+3).) . (*) 
≡ fmap (+3) . (*) 
≡ curry $ (+3) . uncurry (*) 
≡ \l r -> l*r + 3 

ओह, रुको, इस हस्ताक्षर जहां वहाँ भी एक कॉम्पैक्ट परिभाषा है था, लगता है कि यह क्या कहा जाता है ...

((.).(.)) (+3) (*) 

मैं बहस चाहते हैं कि लैम्ब्डा समाधान, सबसे स्पष्ट किया जा रहा है, है बल्कि यहां सबसे अच्छा है।

(.:) :: (c->d) -> (a->b->c) -> a->b->d 
f .: i = \l r -> f $ i l r 

कौन सा आप बस (+3) .: (*) लिखने के लिए अनुमति देता है:

क्या मदद करता है, और अक्सर एक एक (या दो) -liner के रूप में सिर्फ स्थानीय स्तर पर किया जाता है, एक कस्टम इन्फ़िक्स के रूप में इस रचना को परिभाषित करने के लिए है।

Btw, समान (b->b->c) -> (a->b) -> a->a->c (इन्फ़िक्स के दोनों तर्क का अधिकार समारोह precompose) के लिए वहाँ a widely-used standard implementation मौजूद है।

+1

मुझे '((।)। (।)) पसंद है 'सबसे अच्छा, मुख्य रूप से क्योंकि मुझे कल्पना करना पसंद है [फ्रैंकी हाउर्ड] (http://en.m.wikipedia.org/wiki/Frankie_Howerd) ने इसे –

+0

+1 के लिए खोजा एफएमएपी (सबसे बढ़िया) और लैम्ब्डा (जिसे मैं किसी भी कोडबेस में चाहता था, मैं काम कर रहा था!) ​​ – monk

+0

हां - लैम्ब्डा लें या बेहतर कार्य को एक नाम दें - सभी ईमानदारी में: अन्य समाधान अभिन्न आनंददायक हैं लेकिन अधिक या कम अपठनीय (आप उन्हें आसानी से फिर से खोज सकते हैं लेकिन मैं अपठनीय कहूंगा) - इस तरह की चीजें हास्केल को "आर्केन आबनूस-टावर" लेबल देती है जो हास्केल – Carsten

2

तुम भी Data.Aviary.Birds से बी 1 या ब्लैक Combinator इस्तेमाल कर सकते हैं। मुझे लगता है कि असली काम के लिए मैं एक लैम्ब्डा का उपयोग करता हूं।

संबंधित मुद्दे