2015-05-26 52 views
8

我试图分配一个提升值到a在GHCi中,为什么我不能在REPL中显示'纯1'?

λ> :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

你试过检查':type a'吗?那可能会告诉你一些事情。 – AJFarmar

+1

@AJFarmar其实,并没有那么多,因为GHCi并没有将'm'默认为'IO'。 – chi

+2

元解释的一点是为了。虽然你可能认为GHCi是一个“Haskell解释器”,但它实际上是一种非常不同的野兽。它是交互式开发Haskell程序的工具。尽管Haskell对保持良好和一致性很担心,但GHCi主要关心便利性和实用性。 – dfeuer

回答

19

GHCi默认Applicative f => fIO。当你做

λ> 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上,所以同样的效果不会发生。

相关问题