Haskell:何时使用类型类以及何时使用具体类型?

时间:2016-02-18 03:17:05

标签: haskell inheritance int typeclass

在声明函数时,我们可以使用类型类或具体类型(我是对的吗?)所以我可以使用" Num"作为类型指示符或" Int"。我不确定" Int"有任何定义的" Num"?我可以定义自己的具体类型"继承"来自" Num"?

我从java / C#继承角度问这个问题,刚开始用Haskell。你能提一些提示吗?

1 个答案:

答案 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的实例。