在本文档的第33页上:http://verify.rwth-aachen.de/fp14/FP14.pdf有以下句子:
“Dieser Kontext besagt,dass bestimmte Typvariablen nur mit Typen einer bestimmten Klasse instantiiert werden durfen。”
所以,在英语中:“这个上下文规定某些类型变量只能用那些属于某些(在上下文定义的)类型类中的类型来实例化。”
Giesl教授的Haskell讲座(英文)的相应部分是在1小时21分钟:http://m.youtube.com/watch?v=P60Rl-JTgMs。
有人可以解释一下“实例化一个类型变量”是什么意思吗?
我知道单词实例化在OO编程的上下文中意味着什么,即实例化一个类。但是这个词在类型变量的上下文中意味着什么呢?
据我所知,类型变量实例化的概念仅适用于编译时,更具体地说,仅适用于类型检查的过程。因此,在运行时不会发生类型变量的实例化。我的这种理解是否正确?
我应该怎么想象当一个类型变量被实例化时会发生什么? 什么时候发生这种事情?这如何适应编译和运行Haskell程序的大局?
答案 0 :(得分:3)
类型变量是一个占位符,可以代表类型声明中的不同类型:在声明(==), (/=) :: Eq a => a -> a -> Bool
中,a
是一个类型变量。到"实例化"它意味着插入特定类型,例如Int
或String
,产生完整的声明,例如Int -> Int -> Bool
或String -> String -> Bool
。
在此示例中,Eq a =>
表示类型变量a
只能代表Eq
类中的类型。您无法使用==
和/=
运算符来比较Eq
类中不属于的类型的值。
类型变量实例化在编译时发生。您可以将其视为编译器"创建"具有泛型类型(例如Int -> Int
)的定义中特定具体类型(例如a -> a
)的函数版本。 (这只是一种思考它的方式;编译器实际上并不一定为它使用的每种类型编译一个单独的函数版本。)