在声明函数时,我们可以使用类型类或具体类型(我是对的吗?)所以我可以使用" Num"作为类型指示符或" Int"。我不确定" Int"有任何定义的" Num"?我可以定义自己的具体类型"继承"来自" Num"?
我从java / C#继承角度问这个问题,刚开始用Haskell。你能提一些提示吗?
答案 0 :(得分:6)
从OO的角度来看,类型类就像接口或trait。在Haskell中,当您需要数据类型的某种结构(因为您将解压缩它)时,通常使用具体类型,而当您只需要某种行为时,则使用类型类。例如,您可以写
f :: Int -> Int -> Int
f x y = x + y
但你不在这里使用Int
的内部结构;你只需要支持添加的东西,Num
(注意它在方法列表中有(+)
):
f :: Num a => a -> a -> a
f x y = x + y
是的,当然,您可以声明您自己的类支持Num
接口。查看上面的链接,有一个名为“最小完整定义”的方法列表。这是使用它的其他功能将依赖的。在紧要关头,您可以明确地将一些方法设置为undefined
,但如果有人试图调用它们,您将收到运行时错误:
data MyData = MyData Int Int
instance Num MyData where
(MyData x1 y1) + (MyData x2 y2) = MyData (x1 + y1) (x2 + y2)
(*) = undefined
...
了解如何使用MyData
结构的知识从中抽象出类的可能用户?如果他们想要将这种类型的两个值一起添加,他们不需要知道数据是如何安排在内部的,他们只需要知道它是Num
的实例。