में हास्केल, मैं इस तरह if
लागू हो सकता है:इदरिस उत्सुक मूल्यांकन
if' True x y = x
if' False x y = y
spin 0 =()
spin n = spin (n - 1)
यह बर्ताव करता है मैं कैसे उम्मीद:
haskell> if' True (spin 1000000)() -- takes a moment
haskell> if' False (spin 1000000)() -- immediate
रैकेट में, मैं कर सकता एक दोषपूर्ण if
इस तरह लागू करें:
(define (if2 cond x y) (if cond x y))
(define (spin n) (if (= n 0) (void) (spin (- n 1))))
यह बर्ताव करता है मैं कैसे उम्मीद:
if' : Bool -> a -> a -> a
if' True x y = x
if' False x y = y
spin : Nat ->()
spin Z =()
spin (S n) = spin n
यह व्यवहार surpris:
racket> (if2 #t (spin 100000000) (void)) -- takes a moment
racket> (if2 #f (spin 100000000) (void)) -- takes a moment
में इदरिस, मैं if
इस तरह लागू हो सकता है मुझे es:
idris> if' True (spin 1000)() -- takes a moment
idris> if' False (spin 1000)() -- immediate
मैं Irdis रैकेट, जहां दोनों बहस का मूल्यांकन कर रहे हैं की तरह व्यवहार की उम्मीद है। लेकिन यह मामला नहीं है!
इडिस कैसे निर्णय लेते हैं कि चीजों का मूल्यांकन कब किया जाए?
धन्यवाद! मुझे 'स्पिन: नेट ->() 'to spin: Nat -> बूल' (मुझे लगता है कि इडिस का एहसास हुआ है '()' केवल एक निवासियों के पास है और कॉल को 'स्पिन' में अनुकूलित कर दिया गया है), लेकिन बाद में कि निष्पादन योग्य ने चलाने के लिए एक पल लिया, चाहे वह 'अगर' की कौन सी शाखा नीचे चला गया हो। – Snowball
हां, यह मिटा दिया जाएगा()। दरअसल वर्तमान मास्टर में यह बहुत गहराई से विश्लेषण का विश्लेषण करता है, इसलिए आपको शायद यह सुनिश्चित करने के लिए स्पिन एन के परिणाम छापने की तरह कुछ करना होगा ... –
कैसे पता चलता है कि 'स्पिन 1000' है समाप्त हो रहा है और इसका कोई दुष्प्रभाव नहीं है, कि इस अभिव्यक्ति का संकलन समय पर मूल्यांकन नहीं किया गया है और इसके परिणामस्वरूप जेनरेट कोड में बदल दिया गया है, ताकि 'if''-line के दोनों संस्करण तुरंत परिणाम पर अपना परिणाम वापस कर सकें? (उपरोक्त स्नोबॉल टिप्पणी से संकेत मिलता है कि यह नहीं है।) – Lii