2014-05-12 7 views
16

मैंने पढ़ा कि $! ऑपरेटर सख्त मूल्यांकन बल देता है। तो यह अभी भी क्यों काम करता है?

Prelude> take 10 $! repeat 1 
[1,1,1,1,1,1,1,1,1,1] 

मैं उम्मीद कर रहा था कि जीसी हमेशा की अनंत सूची का मूल्यांकन करने की कोशिश कर रहा है।

उत्तर

26

$!कमजोर सिर सामान्य रूप पर अपना दूसरा तर्क बल देता है, जिसका मूल रूप से इसका अर्थ है कि यह अपने तर्क के बाहरीतम कन्स्ट्रक्टर का मूल्यांकन करता है। तो आपके मामले में, यह पूरी सूची के मूल्यांकन को मजबूर नहीं करेगा, बल्कि केवल बाहरी (यानी पहले) : कन्स्ट्रक्टर का मूल्यांकन करेगा।

Haskell: What is Weak Head Normal Form? पर सामान्य रूप बनाम डब्ल्यूएचएनएफ का एक अच्छा स्पष्टीकरण है।

ध्यान दें कि आप पूरी सूची के मूल्यांकन के लिए मजबूर करता है, तो (जैसे Control.DeepSeq मॉड्यूल से $!! ऑपरेटर का प्रयोग करके), अपने कार्यक्रम समाप्त नहीं होगा:

λ: import Control.DeepSeq (($!!)) 
λ: take 10 $!! repeat 1 
^C 
+0

जुड़ा हुआ इतना कमजोर हेड सामान्य प्रपत्र पर थ्रेड एक महान है पढ़ें, धन्यवाद! – knick

+1

ध्यान दें कि 'n> 0' के लिए 'एन एन' लेना, सूची को डब्ल्यूएचएनएफ को किसी भी तरह से मजबूर करना है, इसलिए '10 डॉलर लें! दोहराना 1' परिचालन रूप से '10 $ दोहराना 1' लेना जैसा ही है। –

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