GHCi中的“return 1”如何显示“1”? [复制]

Posted

技术标签:

【中文标题】GHCi中的“return 1”如何显示“1”? [复制]【英文标题】:How does "return 1" show "1" in GHCi? [duplicate] 【发布时间】:2019-05-23 07:08:33 【问题描述】:

这是我在 GHCi 中输入 return 1 时得到的结果。

> return 1
1

由于我没有指定return的类型,所以return 1的类型是Monad m, Num a => m a

即使没有Show 的实例,GHCi 如何显示1

【问题讨论】:

默认的 Monad 是 IO。 IO没有Show,但是当你返回一个IO时,GHCi不会Show它,而是运行它,并显示结果(这里是一个Integer,确实有Show)。 【参考方案1】:

Monad m => m 默认为IO,就是这样。

然后执行IO动作,不做I/O,返回值。

Ghci 有两种输出操作模式:当评估值的类型为IO a 时,当它没有时。在第一种情况下,执行 IO 操作,并显示该操作生成的类型为 a 的值。在第二种情况下,只显示评估值。

由于您在 Ghci 中,return 1 :: (Monad m, Num a) => m a 的类型实际上是 IO Integerm 默认为IOa 默认为Integer,所以会显示Integer 1

启用显示类型的 GHCi,使用 ghci> :set +t,然后尝试 return 1.0。它返回Double,而Doubles 也有Show 实例。

> return 1
1
it :: Integer

> return 1.0
1.0
it :: Double

> return "3"
"3"
it :: [Char]

> print "3"
"3"
it :: ()

【讨论】:

以上是关于GHCi中的“return 1”如何显示“1”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何读取 ghci 类型错误?

ghci 仅显示类型类方法

如何获得光泽以不关闭 ghci?

如何让 ghci 查看我从 cabal 安装的软件包?

如何让 GHCi 加载 Opengl 包?

GHCi“让”——它有啥作用?