ghci适用特殊情况?

时间:2011-10-31 02:30:10

标签: haskell monads ghci applicative

在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)不会打印任何内容。

1 个答案:

答案 0 :(得分:11)

如果您使用return而不是pure,则会出现相同的行为。要找出要做的事情,ghci必须为给定的表达式选择一种类型。 ghci的默认规则是这样的,如果没有其他约束,它会为IOApplicative实例选择Monad。因此,它将pure 1解释为类型IO Integer的表达式。如果1. IO a有一个a实例,而Show不是a,则会在提示符处输入()类型的表达式并打印其结果}。因此,在提示符下输入pure 1会导致

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

正在执行(以及与返回的it绑定的魔术变量v)。对于pure (),特殊情况适用,因为()被视为无趣,因此只有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实例,当然)。