2011-10-31 7 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 

いApplicativeの実行GHCiのとちょうど同じようIO、結果を表示し、この意味ですか?

pure()pure (+1)は何も印刷しません。

答えて

11

pureの代わりにreturnを使用する場合、同じ現象が発生します。何をすべきかを知るには、ghciは与えられた式の型を選択しなければなりません。 ghciのデフォルトルールは、他の制約がなければ、ApplicativeまたはMonadインスタンスに対してIOを選択します。したがって、タイプIO Integerの式としてpure 1が解釈されます。 aShowのインスタンスを持ち、2. a()ではない場合、プロンプトで入力したタイプIO aの式が実行され、その結果が出力されます。したがって、実行中の

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

にプロンプ​​ト結果(返さvに結合マジック可変it)でpure 1に入ります。は、特別な場合が適用されます。()は面白くないとみなされ、したがってreturn()が実行され、が()にバインドされます。pure (+1)の場合、関数が返されます。スコープ内の関数のインスタンスはShowになりません。しかし、スコープ内の機能のため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インスタンスから独立している(使用することができます)。

+2

「インスタンス適用IO」が実現しました。したがって、 'pure 1 >> = \ it - >それを印刷することもできます。私は 'Text.Show.Functions'モジュールについて知りました。私はいつも関数がデフォルトで表示できないのかどうか疑問に思ってきました。 – gawi

+0

Applicative、Functor、IOを使用したもう1つの例です: 'pure(+1)<*> fmap(read :: String - > Int)getLine' – nponeccop