GHCi具有/不具有Show约束的值的不同行为

时间:2018-06-07 03:04:04

标签: haskell polymorphism ghci

我试图理解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约束会改变这种行为?我认为在尝试打印价值时会假设。

1 个答案:

答案 0 :(得分:5)

默认ghci适用于IO monad。因此,当您尝试评估a时,其m类型变量变为IOa变量的类型为Num a => IO a。在repl中评估IO操作时,ghci只执行它并打印结果。在您的情况下,这是Num a => aNumghci 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