我有以下代码:
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
要选择哪个实例。然而,由于扩展违约,这确实在ghci的工作:
λ> toString 5
"5"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句