我试图给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
有人对此有任何想法吗?
最佳答案
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
ed,则将其打印出来。请注意,此GHCi魔术仅在最高级别发生。
当您尝试
show a
时,GHCi会在整个show a
而不是a
上尝试其魔力,因此不会发生相同的效果。关于haskell - 在GHCi中,为什么我不能在REPL中显示 `pure 1`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30464891/