मैं एक दोस्त को हास्केल सीखने में मदद कर रहा हूं और उसने हाल ही में इस तरह का कोड बनाया है, जो रनटाइम पर एक सीपीयू-बर्निंग लूप जांचता है और बनाता है। मैं इस से पूरी तरह से परेशान हूँ।नियंत्रण आयात क्यों करता है। अनुप्रयोग इस खराब कोड को चेक टाइप करने की अनुमति देता है?
import Control.Monad
import Control.Applicative
main = forever putStrLn "Hello, infinity"
जो चेक टाइप नहीं करना चाहिए, लेकिन करता है। सही संस्करण स्पष्ट रूप से होगा:
main = forever $ putStrLn "Hello, infinity"
क्या अजीब और मेरे लिए आश्चर्य की बात है कि आप के साथ और Control.Applicative आयात किए बिना अलग परिणाम प्राप्त है। आयात करने के बिना, यह जाँच टाइप नहीं करता है:
Prelude Control.Monad> forever putStrLn "Hello, infinity"
<interactive>:1:1:
No instance for (Monad ((->) String))
arising from a use of `forever'
Possible fix: add an instance declaration for (Monad ((->) String))
In the expression: forever putStrLn "Hello, infinity"
In an equation for `it': it = forever putStrLn "Hello, infinity"
मैं Control.Applicative के लिए स्रोत में ((->) String
के लिए एक इकाई उदाहरण नहीं दिख रहा है, तो मैं के अपने प्रयोग के कारण कुछ अजीब हो रहा है अनुमान लगा रहा हूँ नियंत्रण। श्रेणी या नियंत्रण। तीर, लेकिन मुझे नहीं पता। तो मुझे लगता है कि मेरे पास दो प्रश्न हैं:
- नियंत्रण आयात करने के बारे में क्या है। आवेदन यह है कि ऐसा होने देता है?
- जब यह अनंत लूप में प्रवेश करता है तो क्या हो रहा है? हास्केल वास्तव में उस मामले में निष्पादित करने का प्रयास कर रहा है?
धन्यवाद,
क्या आप विस्तार कर सकते हैं कि '(->) ई' के लिए क्या उदाहरण उपयोगी है? –
@DanielLyons यह उपयोगी है जब आपके पास कई फ़ंक्शन हैं जिन्हें सभी को कुछ साझा कॉन्फ़िगरेशन जानकारी तक पहुंच की आवश्यकता है। फिर आप लिख सकते हैं (उदाहरण के लिए) 'foo >> = bar >> = baz' हर जगह पर्यावरण को दोहराने के बजाय '\ e -> x = foo e; वाई = बार एक्स ई; z = baz y e y y में। –