我尝试将提升值分配给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
有没有人对此有任何想法?
答案 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
上尝试它的魔法,所以不会发生同样的效果。