我有以下代码:
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/