我试图给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/

10-13 03:09