Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 类型类在Haskell中是如何工作的?_Class_Haskell_Typeclass - Fatal编程技术网

Class 类型类在Haskell中是如何工作的?

Class 类型类在Haskell中是如何工作的?,class,haskell,typeclass,Class,Haskell,Typeclass,我真的对哈斯克尔的课程感到困惑。如果我有代码: class GetResult n where res :: n -> Int class (GetResult n) => Model n where starting :: Int -> [Int] -> n starting i j = .....

我真的对哈斯克尔的课程感到困惑。如果我有代码:

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

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

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

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

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

在这种情况下,
n
将是
Int
n
是一个类型变量,而不是任何特定类型。特定类型可以是
GetResult
Model
的实例,每个实例都将在类中定义的函数类型中“填空”

因此,
启动
的完整类型是(您可以通过使用
:t启动
从ghci获得此信息):

您可以将其理解为“对于作为
模型
实例的任何类型,
启动
采用
Int
[Int]
并返回该类型的值”。同样地,
test
采用属于
Model
实例的任何类型,并返回相同类型的值


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

如果您来自OO背景,请尝试始终将haskell类视为(通用)接口,而不是OO类。它们不是完全等价的,但是给你一个更好的近似值。
starting :: Model n => Int -> [Int] -> n