2011-10-31 14 views
8

GHCi में:आवेदन के लिए ghci विशेष मामला?

λ> :t (pure 1) 
(pure 1) :: (Applicative f, Num a) => f a 
λ> show (pure 1) 

<interactive>:1:1: 
    No instance for (Show (f0 a0)) 
     arising from a use of `show' 
    Possible fix: add an instance declaration for (Show (f0 a0)) 
    In the expression: show (pure 1) 
    In an equation for `it': it = show (pure 1) 
λ> pure 1 
1 

क्या इसका मतलब है कि अनुप्रयोगी निष्पादित GHCi और बस IO की तरह परिणाम प्रदर्शित करता है,?

ध्यान दें कि pure() और pure (+1) कुछ भी प्रिंट नहीं करता है।

उत्तर

11

यदि आप pure के बजाय return का उपयोग करते हैं तो आपको वही व्यवहार मिलता है। यह जानने के लिए कि क्या करना है, ghci को दिए गए अभिव्यक्ति के लिए एक प्रकार का चयन करना होगा। ghci के डिफ़ॉल्ट नियम ऐसे हैं जो अन्य बाधाओं को अनुपस्थित करते हैं, यह IO को Applicative या Monad उदाहरण के लिए चुनता है। इस प्रकार यह की अभिव्यक्ति के रूप में pure 1 का अर्थ है। प्रॉम्प्ट पर दर्ज IO a के अभिव्यक्ति निष्पादित किए गए हैं और उनके परिणाम मुद्रित किए गए हैं, यदि 1. a में Show उदाहरण है और 2. a() नहीं है। इस प्रकार

v <- return (1 :: Integer) 
print v 
return v 

में शीघ्र परिणाम पर pure 1 में प्रवेश निष्पादित किया जा रहा है (और जादू चर it लौटे v करने के लिए बाध्य)। pure() के लिए, विशेष मामले के बाद से () अरुचिकर माना जाता है, इस प्रकार केवल return() निष्पादित किया जाता है और itpure (+1) के लिए () करने के लिए बाध्य, लागू होता है, एक समारोह लौटा दिया जाता है, वहाँ दायरे में कार्यों के लिए कोई Show उदाहरण है, तो कुछ भी नहीं छपा है। हालांकि,

Prelude Control.Applicative> :m +Text.Show.Functions 
Prelude Control.Applicative Text.Show.Functions> pure (+1) 
<function> 
it :: Integer -> Integer 
Prelude Control.Applicative Text.Show.Functions> it 3 
4 
it :: Integer 
दायरे में कार्यों के लिए एक Show उदाहरण के साथ

, यह प्रिंट हो (नहीं है कि यह जानकारीपूर्ण है), और समारोह तो इस्तेमाल किया जा सकता (उत्तरार्द्ध, एक Show उदाहरण दायरे में किया जा रहा से स्वतंत्र है निश्चित रूप से)।

+2

मुझे अभी एहसास हुआ है कि 'उदाहरण आवेदक IO'। इसलिए यह 'शुद्ध 1 >> = \ it -> इसे प्रिंट करने के लिए' प्रिंट करने की अनुमति भी देता है। मैंने अभी 'Text.Show.Functions' मॉड्यूल के बारे में सीखा है। मैंने हमेशा सोचा है कि फ़ंक्शन डिफ़ॉल्ट रूप से क्यों नहीं दिखाए जा रहे थे। – gawi

+0

आवेदक, फ़ंक्शन और आईओ का उपयोग करने का एक और उदाहरण यहां दिया गया है: 'शुद्ध (+1) <*> fmap (पढ़ें :: स्ट्रिंग -> Int) getLine' – nponeccop

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