"return 1" 如何在 GHCi 中显示“1”?
How does "return 1" show "1" in GHCi?
这是我在 GHCi 中输入 return 1
时得到的结果。
> return 1
1
由于我没有指定return
的类型,return 1
的类型是Monad m, Num a => m a
即使 Show
没有实例,GHCi 如何显示 1
?
Monad m => m
默认为IO
,就是这样。
然后执行IO操作,不做I/O,returns值。
Ghci 有两种输出操作模式:评估值具有类型 IO a
和不具有类型。在第一种情况下,执行 IO 操作,并显示操作产生的类型 a
的值。在第二种情况下,只显示评估值。
因为你在 Ghci 中,return 1 :: (Monad m, Num a) => m a
的类型实际上是 IO Integer
。 m
默认为 IO
,a
默认为 Integer
,因此显示 Integer
1
。
使用 ghci> :set +t
启用显示类型的 GHCi,然后尝试 return 1.0
。它 returns Double
和 Double
也有 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
时得到的结果。
> return 1
1
由于我没有指定return
的类型,return 1
的类型是Monad m, Num a => m a
即使 Show
没有实例,GHCi 如何显示 1
?
Monad m => m
默认为IO
,就是这样。
然后执行IO操作,不做I/O,returns值。
Ghci 有两种输出操作模式:评估值具有类型 IO a
和不具有类型。在第一种情况下,执行 IO 操作,并显示操作产生的类型 a
的值。在第二种情况下,只显示评估值。
因为你在 Ghci 中,return 1 :: (Monad m, Num a) => m a
的类型实际上是 IO Integer
。 m
默认为 IO
,a
默认为 Integer
,因此显示 Integer
1
。
使用 ghci> :set +t
启用显示类型的 GHCi,然后尝试 return 1.0
。它 returns Double
和 Double
也有 Show
实例。
> return 1
1
it :: Integer
> return 1.0
1.0
it :: Double
> return "3"
"3"
it :: [Char]
> print "3"
"3"
it :: ()