这是在GHCi中键入return 1
时得到的。
> return 1
1
由于我未指定return
的类型,因此return 1
的类型为Monad m, Num a => m a
即使没有1
的实例,GHCi如何显示Show
?
答案 0 :(得分:9)
Monad m => m
默认为IO
。
然后执行IO操作,不执行I / O,然后返回值。
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
。它返回Double
,并且Double
也有Show
实例。
> return 1
1
it :: Integer
> return 1.0
1.0
it :: Double
> return "3"
"3"
it :: [Char]
> print "3"
"3"
it :: ()