-1

我对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是什么类型?什么类型的开始输出和测试将作为输入?

4

2 回答 2

4

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

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

例如,如果您想创建Int的实例GetResult,可以使用以下实例声明:

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

在这种情况下n将是Int.

于 2012-05-16T23:55:44.583 回答
4

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

所以完整的类型starting是(你可以从 ghci 中得到这个:t starting):

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

您可以将其理解为“对于任何类型的实例Modelstarting接受 anInt和 a[Int]并返回该类型的值”。同样test采用任何类型的实例Model并返回相同类型的值。

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

于 2012-05-16T23:59:26.567 回答