在 GHCi 中,为什么我无法在 REPL 中显示 `pure 1`?

8

我试图将一个提升的值赋给a

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

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

因此,我认为可能有一个针对 ashow 实现方法,并尝试了以下代码:
λ> 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

有人对此有什么想法吗?


你尝试过检查 :type a 吗?或许那会告诉你一些信息。 - AJF
1
@AJFarmar 实际上并不是那么多,因为 GHCi 并没有将 m 默认为 IO - chi
2
需要先解释一下的是,虽然你可能认为GHCi是一个“Haskell解释器”,但它实际上是一种非常不同的工具。它是用于交互式开发Haskell程序的工具。虽然Haskell非常关注保持事物的整洁和一致性,但GHCi主要关注方便和实用性。 - dfeuer
1个回答

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本身,因此不会产生相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接