在GHCi中,为什么我不能在REPL中显示“纯1”?

时间:2015-05-26 17:12:57

标签: haskell monads functor ghci

我尝试将提升值分配给a

λ> :m Control.Applicative
λ> let a = pure 1

当我在REPL中评估a时,会打印1

λ> a
1

因此,我认为可能会为show实施a,并尝试了这一点:

λ> show a

但是GHCi引发了一个错误:

<interactive>:70:1-4:
    No instance for (Show (f0 a0)) arising from a use of ‘show’
    The type variables ‘f0’, ‘a0’ are ambiguous
    Note: there are several potential instances:
      instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
        -- Defined in ‘GHC.Real’
      instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’
      instance (Show a, Show b, Show c) => Show (a, b, c)
        -- Defined in ‘GHC.Show’
      ...plus 32 others
    In the expression: show a
    In an equation for ‘it’: it = show a

有没有人对此有任何想法?

1 个答案:

答案 0 :(得分:19)

GHCi将Applicative f => f默认为IO。当你这样做

λ> a
1

您实际上正在执行IO Integer操作,例如

λ> let a = return 1
λ> a
1

GHCi默认打印IO个动作的结果。因此,结果行中的1。 (相当令人困惑的是,此1不是a的值,也不是a作为IO操作的输出 - 只是后者的返回值。)

GHCi使用复杂的启发式方法来处理用户输入。首先,它尝试show它,可能默认某些类型的类,如数字类。这在你的情况下失败了。当失败时,它会尝试查看输入是否为IO操作。在这种情况下,将运行操作,如果结果可以show,则会打印该操作。

请注意,这种GHCi魔法只发生在顶层。 当你尝试show a时,GHCi会在整个show a而不是a上尝试它的魔法,所以不会发生同样的效果。