我有以下代码:

class ToString a where
    toString :: a -> String

instance ToString String where
    toString a = a

instance ToString Char where
    toString a = [a]

instance ToString Int where
    toString a = show a

instance ToString Integer where
    toString a = show a

instance ToString Float where
    toString a = show a

instance ToString Double where
    toString a = show a

我可以做 toString "Text"toString 't' 并且都编译得很好。但是,如果我执行 toString 5 我得到并出错。我被迫做 toString (5::Int)
show 不需要指定类型即可工作。当我查看 Show 的实现时,我没有看到任何神奇的东西:
instance Show Int where ...instance Show Integer where ...
我做错了什么需要我指定类型以及如何修复它?

更新:

我按照下面的建议添加了 {-# LANGUAGE ExtendedDefaultRules #-},它运行良好。解决了我的问题。

最佳答案

您需要指定类型,因为 5 在 Haskell 中是多态的:

λ> :type 5
5 :: Num a => a

所以编译器不知道选择哪个 Num 实例。但是,由于 extended defaulting ,这在 ghci 中确实有效:
λ> toString 5
"5"

关于haskell - 为什么我必须在这里指定类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39338899/

10-09 19:24