2012-05-16 57 views
-1

我真的很困惑haskell中的类。如果我有代码:类型类在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是什么类型?开始输出和测试的输入是什么类型?

+1

如果您来自OO背景,请尝试始终将haskell类视为(通用)接口而不是OO类。它们并不完全等效,但给你一个更好的近似值。 – phg

回答

4

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

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

至于如果你想使IntGetResult一个实例,你可以使用下面的实例声明的例子:

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

在这种情况下nInt

4

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

所以丰满型的starting是(你可以从ghci中与:t starting得到这个):

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

你可以阅读这是“对任何类型的是Model一个实例,starting需要一个Int和一个[Int]并返回该类型的值“。同样,test采用任何类型,它是Model的一个实例,并返回相同类型的值。

在任何特定调用starting,返回的类型将由上下文决定;它会返回任何类型的返回值的值(假设存在一个合适的实例)。