我试图理解GHCi打印值的作用,我认为它只会在值上调用putStrLn . show
,但后来发生了这样的事情:
a = return 5 :: (Monad m, Num a) => m a
a -- prints 5
b = return 5 :: (Monad m, Num a, Show (m a)) => m a
b -- Ambiguous type variable `m0`...
为什么添加show约束会改变这种行为?我认为在尝试打印价值时会假设。
答案 0 :(得分:5)
默认ghci
适用于IO
monad。因此,当您尝试评估a
时,其m
类型变量变为IO
。 a
变量的类型为Num a => IO a
。在repl中评估IO
操作时,ghci
只执行它并打印结果。在您的情况下,这是Num a => a
(Num
中ghci
Integer
约束的多态变量的默认值为IO
数据类型。
但Show
数据类型没有ghci
个实例。没有这样的例子,它甚至不存在!在评估Show (IO a)
中的某个表达式之前,它应该满足所有约束。由于它不能满足IO
(因为没有这样的实例),因此无法将m
替换为m
类型变量。但那么:ghci
你到底想要什么? m
无法为您猜测。不同ghci> b = return 5 :: (Monad m, Num a, Show (m a)) => m a
ghci> b :: Maybe Int
Just 5
ghci> b :: [Int]
[5]
的行为是不同的。
pre-commit