हास्केल से आ रहा है, मैं आलसी की कहानी आलसी (गैर-कठोरता) के बारे में पढ़ रहा था। मैं हाल ही में रिलीज नोट्स trolled, और found code निम्नलिखितक्या इडिस वास्तव में "सख्ती से मूल्यांकन किया गया है?"
myIf : (b : Bool) -> (t : Lazy a) -> (e : Lazy a) -> a
myIf True t e = t
myIf False t e = e
जैसा मैं इसे
myFact : Int -> Int
myFact n = myIf (n == 1) 1 (n * myFact (n-1))
परीक्षण करने के लिए एक सरल भाज्य समारोह लिखा था मैं इसे भाग गया और यह काम किया!
> myFact 5
120 : Int
मैं
myIf : (b : Bool) -> a -> a -> a
को myIf
के प्रकार के हस्ताक्षर बदलकर इसे तोड़ने का फैसला किया मैं idris
repl पुनः लोड, और myFact 5
भागा फिर से एक अनंत प्रत्यावर्तन की उम्मीद। मेरे आश्चर्य के लिए, यह अभी भी वैसे ही काम किया!
क्या कठोरता से बचने पर idris पता लगा सकता है? यह हमेशा के लिए क्यों नहीं?
मैं इडिस 0.9.15 का उपयोग कर रहा हूं और अब और लिंक किए गए नोट्स के बीच रिलीज नोट्स में से कोई भी, किसी भी बदलाव का उल्लेख नहीं करता है।
मेरा आरईपीएल वही काम करता है। हालांकि, अगर मैं आरईपीएल में 'myx 'के साथ' myFact 'कहता हूं, या निष्पादन योग्य को संकलित करता हूं, तो मुझे अनंत लूप मिल जाता है। –
[इडिस उत्सुक मूल्यांकन] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/23149532/idris-eager-evaluation) – Cactus