Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在GHCi中,为什么可以';我不能在REPL中显示'pure 1'吗?_Haskell_Monads_Functor_Ghci - Fatal编程技术网

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则主要关注便利性和实用性。