类型类在Haskell中如何工作?

时间:2012-05-16 23:48:06

标签: class haskell typeclass

我对haskell中的类感到困惑。如果我有代码:

class GetResult n where res :: n -> Int
class (GetResult n) => Model n where
                                     starting :: Int -> [Int] -> n
                                     starting i j = .....
                                     test :: n -> n
                                     test n = ......

什么类型的n?什么类型的输出和测试作为输入?

2 个答案:

答案 0 :(得分:4)

你的困惑可能是因为Haskell中的类型类与OO中的类无关。最重要的是类型类不描述对象,它们描述类型。

类型类描述了一组方法。您可以为给定类型实现这些方法,以使该类型成为类的实例。因此,GetResult的类型类定义可以理解为“通过实现类型res的方法n -> Int,可以使类型n成为GetResult的实例”。因此,n只是想要成为GetResult的实例的类型。

例如,如果您想使Int成为GetResult的实例,则可以使用以下实例声明:

instance GetResult Int where
    res :: Int -> Int
    res i = i

在这种情况下,n将为Int

答案 1 :(得分:4)

n是一个类型变量,不是任何特定类型。特定类型可以是GetResultModel的实例,每个实例将在类中定义的函数类型中“填充空白”。

所以starting的完整类型是(您可以使用:t starting从ghci获取此内容):

starting :: Model n => Int -> [Int] -> n

您可以将其视为“对于Model的实例的任何类型,starting需要Int[Int]并返回该类型的值” 。同样,test采用任何类型为Model的实例,并返回相同类型的值。

starting的任何特定调用中,返回的类型将由上下文确定;它将返回其返回值在该上下文中使用的任何类型的值(假设存在合适的实例)。