Haskell 在GHCi中,为什么可以';我不能在REPL中显示'pure 1'吗?
我试图将提升值分配给Haskell 在GHCi中,为什么可以';我不能在REPL中显示'pure 1'吗?,haskell,monads,functor,ghci,Haskell,Monads,Functor,Ghci,我试图将提升值分配给a λ> :m Control.Applicative λ> let a = pure 1 当我在REPL中计算a时,它会打印1 λ> a 1 因此,我认为对于a,可能存在show的实现,并尝试了以下方法: λ> show a 但GHCi抛出了一个错误: <interactive>:70:1-4: No instance for (Show (f0 a0)) arising from a use of ‘show’ T
a
λ> :m Control.Applicative
λ> let a = pure 1
当我在REPL中计算a
时,它会打印1
λ> a
1
因此,我认为对于a
,可能存在show
的实现,并尝试了以下方法:
λ> 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
:70:1-4:
没有因使用“Show”而产生的(Show(f0 a0))实例
类型变量“f0”、“a0”不明确
注意:有几个潜在的例子:
实例(积分a,显示a)=>Show(GHC.Real.Ratio a)
--在“GHC.Real”中定义
实例(Show a,Show b)=>Show(a,b)--在“GHC.Show”中定义
实例(Show a,Show b,Show c)=>Show(a,b,c)
--在“GHC.Show”中定义
…加上其他32个
在表达式中:show a
在“it”的方程式中:it=显示
有人对此有什么想法吗?GHCi将
Applicative f=>f
默认为IO
。当你这样做的时候
λ> a
1
您实际上运行了一个IO Integer
操作,例如
λ> let a = return 1
λ> a
1
默认情况下,GHCi打印IO
操作的结果。因此,结果行中的1
。(非常令人困惑的是,这个1
不是a
的值,也不是作为IO
操作运行a
的输出——只是后者的返回值。)
GHCi使用复杂的启发式方法来处理用户输入。首先,它尝试显示它,可能会默认一些类型类,如数值类。这在你的情况下是失败的。如果失败,它会尝试查看输入是否为IO
操作。在这种情况下,将运行该操作,如果结果可以show
ed,则将其打印出来
请注意,这种GHCi魔法只发生在顶级。
当您尝试显示a
时,GHCi在整个显示a
,而不是a
上尝试了它的魔力,因此相同的效果不会发生。您是否尝试检查:键入a
?这可能会告诉你一些事情。@AJFarmar实际上,没有那么多,因为GHCi还没有将m
默认为IO
。一点元解释是正确的。虽然你可能认为GHCi是一个“Haskell解释器”,但它实际上是一种完全不同的野兽。它是一种交互式开发Haskell程序的工具。Haskell非常担心保持事物的良好和一致性,而GHCi则主要关注便利性和实用性。