2012-10-06 13 views
13

हूँ मैं हास्केल के लिए नया हूँ, और मुझे आश्चर्य है कि वहाँ पता लगाने के लिए अगर एक Hoogle से पुस्तकालय की कार्यक्षमता डुप्लिकेट की बेहतर तरीका है - [एक -> एक मीटर]? बिंदु मेंइकाई मीटर => एक ->> एक

मामला: मैं की तरह

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4 

, कार्यों f :: Monad a => a -> m a है कि मैं एक साथ श्रृंखला करना चाहते हैं की एक संख्या है लेकिन मैं नहीं बल्कि

chain :: Monad m => a -> [a -> m a] -> m a 
chain = foldl (>>=) <$> return 
f1234 = (flip chain) [f1, f2, f3, f4] 

लिखते हैं यह बहुत ही बुनियादी लगता है, करता है आधार libary कुछ chain के बराबर कुछ ऑफर?

+1

एक वैकल्पिक hoogle को सबसे उपयुक्त मॉड्यूल अनुमान लगा और फिर इसके प्रलेखन पृष्ठ ब्राउज़ अंतर्ज्ञान का एक सा के साथ, है। आपको अपना कोड छोटा करने का कोई अन्य तरीका मिल सकता है, या आप याद रखना चाहते हैं कि कुछ अन्य उपयोगी काम मिल सकता है। इस रणनीति आधार पैकेज के साथ और उसके बाद (इकाई और Applictive की तरह, बाद में और अधिक उन्नत Foldable और traversable) 'अमूर्त' मॉड्यूल और पैरामिट्रीकृत patternlike डेटाटाइप्स (जैसे हो सकता है, सूची) के लिए सबसे अच्छा काम करता है। यद्यपि आप इसे अधिक उपयोग किए जाने वाले डेटाटाइप के लिए भी कर सकते हैं (मेरे लिए, मानचित्र/सेट और बाद में मोनाड ट्रांसफॉर्मर्स)। – Laar

+0

'श्रृंखला = foldl (>> =)। वापसी' *** बहुत स्पष्ट है ***, आईएमएचओ। –

उत्तर

17

Hoogle के अच्छे के लिए इस, और एक ही प्रकार के साथ एक समारोह को खोजने के लिए निश्चित रूप से सही उपकरण।

यह देखते हुए कि यह सीधा है, और यह किसी भी सामान्य स्थानों में नहीं बढ़ रहा है, आप इसे स्वयं को कुछ अस्पष्ट मॉड्यूल से आयात के रूप में लिख सकते हैं, आंशिक रूप से क्योंकि आप अन्य चीजों का पूरा भार आयात नहीं करेंगे।

(एक तरफ: कुछ संकुल hoogle से खोजा होने लगते हैं नहीं है, इसलिए यदि आप समारोह, मॉड्यूल या पैकेज नाम पता है कि तुम के बाद कर रहे हैं और hoogle पता नहीं है, उपयोग hayoo।)

मैं Control.Monad से

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) 

प्लग करने के लिए करना चाहते हैं। यह रचना ऑपरेटर है जिसे मैं हमेशा तब तक चाहता था जब तक मुझे यह नहीं मिला। यह एक अधिक प्राकृतिक तरीके से मेरे विचार में >>= से monads साथ काम करने के लिए है।

तुम भी सीधे इस्तेमाल कर सकते हैं, यह बहुत स्पष्ट है:

f1234 = f1 >=> f2 >=> f3 >=> f4 

यह पता चलता है अगर आप (a -> m a) -> (a -> m a) -> (a -> m a) के लिए hoogle, तो एक भविष्य की रणनीति आप कुछ है जो जोड़ती है कुछ की एक सूची के लिए है के लिए देख रहे हैं एक फ़ंक्शन की खोज करें जो दो को जोड़ती है और fold फ़ंक्शंस में से किसी एक का उपयोग करें।

इस प्रकार

chain' :: Monad m => [a -> m a] -> a -> m a 
chain' = foldr (>=>) return 

f1234 = chain' [f1,f2,f3,f4] 

या

chain'' :: Monad m => a -> [a -> m a] -> m a 
chain'' = flip $ foldr (>=>) return 

अगर आप पसंद करते हैं, लेकिन तुम्हारा वैसे भी ठीक है।

+5

ध्यान दें कि 'f1> => f2> => f3> => f4'' चेन 'से अधिक सामान्य है [f1, f2, f3, f4]' क्योंकि यह 'a -> mb' और' b - > एमसी'। – nponeccop

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