2015-10-19 4 views
11

मुझे हाल ही में इडिस का थोड़ा सा सीखने की लक्जरी है और एक चीज़ जो मुझे बेहद सुविधाजनक मिली है! -नोटेशन, जो मुझे एक के अंदर मोनैडिक कोड छोटा कर देता है बहुत अच्छेइडिस का हास्केल संस्करण! -नोटेशन (बैंग नोटेशन)

someFunction !a !b !c 

को इस तरह के रूप

a' <- a 
b' <- b 
c' <- c 
someFunction a' b' c' 

ब्लॉक अब जब मैं हास्केल में कोड लिख सकता हूँ, मैं इसी तरह की है, लेकिन जहाँ तक मैं बता यह मौजूद नहीं है कर सकते हैं कुछ के लिए देख रहा हूँ (और बैंग चरित्र स्पष्ट रूप से पहले से ही सख्त पैटर्न मिलान के लिए उपयोग किया जाता है)। क्या डू ब्लॉक के अंदर तुच्छ बाएं तीर का गुच्छा होने से बचने का कोई तरीका है? शायद एक एक्सटेंशन जो एक पुनर्लेखन नियम, या उस प्रभाव के लिए कुछ जोड़ता है?

उत्तर

20

के बाद से हर इकाई एक Applicative है (साथ GHC> = 7.10) हम लिख सकते हैं

someFunction <$> a <*> b <*> c 

ध्यान दें कि यदि someFunction प्रकार m T के monadic मान देता है, ऊपर m (m T) वापस आ जाएगी, जो की संभावना नहीं है क्या हम चाहते हैं (जैसा कि @pigworker नीचे बताता है)। हम फिर भी join दोनों एक साथ परतों कर सकते हैं:

join $ someFunction <$> a <*> b <*> c 
+1

बिल्कुल सही जवाब, बिल्कुल मुझे क्या चाहिए। मुझे लगता है मुझे आवेदक के साथ थोड़ा और समय बिताने की जरूरत है। धन्यवाद। – Karl

+2

'कुछ समारोह' का प्रकार क्या है? क्या इसका रिटर्न टाइप मोनैडिक है? – pigworker

+0

@pigworker अच्छा बिंदु, मैंने वास्तव में उस मामले को अनदेखा किया। – chi

6

@ ची के जवाब के लिए एक वैकल्पिक liftA3 someFunction a b c है (join साथ की जरूरत है)। नहीं तीर के

2

बात हो रही है ...

import Control.Arrow 

a' = Kleisli $ const a 
b' = Kleisli $ const b 
c' = Kleisli $ const c 

foo = (`runKleisli`()) $ 
    (a' &&& b') &&& c' >>> uncurry (uncurry someFunction) 

है कि मैं इस सलाह देते हैं।

+4

ईडब्ल्यू, ईडब्ल्यू, ईडब्ल्यू। क्या? – dfeuer

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