2011-04-10 12 views
11

Haskell Performance Resource विकि-अनुभाग में, आगे बताया नहीं सिफारिश"सख्त रिटर्न" के अर्थशास्त्र क्या हैं?

  • उपयोग सख्त रिटर्न (return $! ...) जब तक आपको निश्चित रूप से आलसी जरूरत के लिए दिया जाता है।

यह एक अच्छी बात क्यों है? जब ... -expression (Whnf-) को मजबूर किया गया है तो मजबूर होना चाहिए?

"वाम पहचान" इकाई जी और परिभाषा

f $! x = x `seq` f x 

मैं (do -notation` में) पुनर्लेखन कर सकते हैं को देखते हुए:

do x' <- return $! x 
    f x' 

do x' <- x `seq` return x 
    f x' 

लिए लेकिन ऐसा लगता है कि मैं

नहीं प्राप्त कर सकता
do f $! x 

पुनश्च: अगर BangPatterns -extension उपलब्ध है,

do !x' <- return x 
    f x' 

पहले do -expression ऊपर दिए गए के रूप में अर्थ की दृष्टि से एक ही है?

उत्तर

5

एक कारण आप से

do x' <- x `seq` return x 
    f x' 

f $! x 

यह क्योंकि वे एक ही नहीं हैं करने के लिए नहीं मिल सकता है।

(x `seq` return x) >>= (\ x' -> f x') 

seq केवल तभी (>>=) अपनी पहली बहस में सख्त है मूल्यांकन किया जाएगा: बस करते अंकन का विस्तार करें। यह जरूरी नहीं है।

+0

मैं देख रहा हूँ द्वारा दिया जाता है ... लेकिन इस 'वापसी $ की उपयोगिता के बारे में क्या कहना है! ... '? क्या यह केवल सख्त monads के लिए समझ में आता है? – hvr

+0

@hvr: यदि मोनड इसके रिटर्न-प्रकार में सख्त है, तो हाँ। निर्माण विशेष रूप से उपयोगी है, मोनैड के लिए जहां आप आम तौर पर मोनड के दुष्प्रभाव का मूल्यांकन करना चाहते हैं, न कि मोनड स्वयं। – fuz

+0

यह एक ब्लॉक ब्लॉक में अंतिम चीज़ के लिए समझ में आता है 'वापसी $! ... 'क्योंकि एक (कॉल) फ़ंक्शन का रिटर्न वैल्यू हमेशा मूल्यांकन किया जाता है। यानी, '... >> = \ x -> $ वापसी! ...', एक बार जब लैम्ब्डा अभिव्यक्ति कहा जाता है तो यह '($!)' एप्लिकेशन का मूल्यांकन करने जा रहा है। – augustss

1

आईओ के लिए वहाँ भी उपयोगी Control.Exception.evaluate है:

बलों अपने तर्क कमजोर सिर सामान्य रूप के लिए मूल्यांकन किया जाना जब परिणामी आईओ कार्रवाई निष्पादित किया जाता है। यह का उपयोग अन्य आईओ संचालन के संबंध में के मूल्यांकन के आदेश के लिए किया जा सकता है; इसके अर्थ विज्ञान

evaluate :: a -> IO a 
evaluate x = (return $! x) >>= return 
संबंधित मुद्दे