【发布时间】:2009-11-21 21:07:47
【问题描述】:
我一直遇到一个错误,但不知道如何改正。给我这个错误的代码示例是:
class Someclass a where
somefunc :: (Num b) => b -> a -> a
data Sometype = Somecons Int
instance Someclass Sometype where
somefunc x (Somecons y) = Somecons (x+y)
错误信息是:
无法将预期类型“b”与推断类型“Int”匹配
'b' 是一个刚性类型变量,由 'somefunc' 的类型签名在 error.hs:3:21
在'(+)'的第二个参数中,即'y'
在 'Somecons' 的第一个参数中,即 '(x + y)'
在表达式中:Somecons (x + y)
我了解错误消息试图告诉我我使用了 Int 类型的名称,而他期望的名称为 (Num b) => b。我无法理解的是 Int 适合 (Num b)=>b。编译器不应该理解我告诉他的内容吗(对于这个特定的实例,b 应该是一个整数?我怎样才能使它适合?
评论: 当然,在这个具体的例子中,我可以用类型签名制作 somefunc:
somefunc :: a -> a-> a
但假设我想要类似的东西:
data Newtype = Newcons (Int, Int)
instance Someclass Newtype where
somefunc x (Newtype (y,z) ) = Newtype (y+x, z)
当我尝试在 haskell 中做某事时,这种事情经常发生。
【问题讨论】:
-
嗯...我猜你的意思是
data ...而不是Data... -
是的,当然。谢谢指正。
标签: haskell class type-systems