9

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 が Applicative を実行し、結果を表示するということIOですか?

何も印刷しないpure ()でください。pure (+1)

4

1 に答える 1

12

returnの代わりにを使用すると、同じ動作が得られますpure。何をすべきかを知るために、ghci は与えられた式の型を選択しなければなりません。ghci のデフォルト ルールは、他の制約がなければorインスタンスを選択IOするものです。したがって、 type の式として解釈されます。1.にインスタンスがあり、 2.がない場合、プロンプトで入力されたタイプの式が実行され、その結果が出力されます。したがって、プロンプトで入力すると、ApplicativeMonadpure 1IO IntegerIO aaShowa()pure 1

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

it実行中 (および返された にバインドされたマジック変数v)。forの場合、は面白くないと見なされるため、 のみが実行され、 にバインドさpure ()れるため、特殊なケースが適用されます。 forの場合、関数が返され、スコープ内に関数のインスタンスがないため、何も出力されません。でも、()return ()it()pure (+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もちろん、後者はスコープ内にあるインスタンスとは無関係です)。

于 2011-10-31T03:05:11.607 に答える