2011-06-28 16 views
6

मैं समझता हूं कि:टपल धमाके पैटर्न

f x = x + 1 where !y = undefined

धमाके पैटर्न का अर्थ है कि yf से पहले मूल्यांकन किया जाना है।

इसी तरह:

f x = x + 1 where !(!a, !b) = (undefined, undefined)

अर्थ x और y w.r.t, एक ही है।

लेकिन क्या धमाके पैटर्न में मतलब है:

f x = x + 1 where (!a, !b) = (undefined, undefined)

यह मूल्यांकन किया जाना अपरिभाषित पैदा करने के लिए नहीं लगता है। इन-टपल बैंग पैटर्न कब प्रभावी होते हैं? यदि पैटर्न के ट्यूपल को मजबूर किया जाता है? क्या कोई ऐसा उदाहरण दे सकता है जहां (!a, !b) = (..)(a, b) = (..) से अलग है?

उत्तर

9

ट्यूपल पर एक बैंग पैटर्न स्वयं ट्यूपल के मूल्यांकन को मजबूर करेगा लेकिन इसके तत्व नहीं। ट्यूपल तत्वों पर बैंग पैटर्न उन्हें मजबूर करेंगे जब भी ट्यूपल का मूल्यांकन किया जाता है।

Prelude> let x = a + 1 where (a, b) = (1, undefined) 
Prelude> x 
2 
Prelude> let x = a + 1 where (!a, !b) = (1, undefined) 
Prelude> x 
*** Exception: Prelude.undefined 
:

यहाँ भिन्न व्यवहार का एक उदाहरण है

4

आप इसका अनुवाद तो let रहे हैं:

f x = let (!a, !b) = (undefined, undefined) in x + 1 

यहाँ, आप एक टपल (a, b) युक्त बनाते हैं, और जब टपल मूल्यांकन किया जाता है, दोनों a और b हैं।

लेकिन क्योंकि ट्यूपल का मूल्यांकन कभी नहीं किया जाता है, न तो a और न ही b हैं। यह मूल रूप से लेखन के रूप में ही है:

f x = let y = undefined `seq` 4 in x + 1 

के बाद से y का मूल्यांकन नहीं किया जाता है, न तो यह है undefined

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