为什么我必须在这里指定类型?

绿仙人掌

我有以下代码:

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 #-}按照下面的建议进行添加,并且效果很好。解决了我的问题。

赖恩·亨里斯(Rein Henrichs)

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

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

因此编译器不知道Num要选择哪个实例。然而,由于扩展违约,这确实在ghci的工作:

λ> toString 5
"5"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章