我看到,在约翰·威利( John,2004 )的“编程语言设计概念”( Programming Language Design Concepts )一书中,有一个关于二进制数据的定义:
“可绑定实体是可以绑定到标识符的实体。可绑定的实体种类不同,编程语言各不相同: ·C的可绑定实体是类型、变量和函数过程。 ·JAVA的可绑定实体是值、局部变量、实例和类变量、方法、类和包。 ·ADA的绑定实体包括类型、值、变量、过程、异常、包和任务。
我很好奇,Haskell里有哪些可绑定的实体?
发布于 2018-06-20 12:38:49
Haskell有三个名称空间,每个名称空间用于运行时计算、类型和模块。
表示运行时计算的任何术语都可以在计算命名空间中命名。data和newtype声明在计算名称空间中创建新名称,用于构造新类型的值,如果使用记录语法,则用于从新类型中选择字段。class声明在计算名称空间中为其方法创建新名称。
任何单形类型都可以在类型命名空间中使用type声明命名(请参阅下面的注释,以了解我对此语句中令人困惑的微妙之处的预测)。data和newtype声明在类型名称空间中创建新名称,用于构造它们声明的类型。class声明在类型名称空间中为它们创建的约束创建新名称。
module声明在模块命名空间中创建新名称。
GHC扩展了Haskell,添加了各种新的绑定名称的方法(几乎所有的方式都在类型名称空间中);对于这种格式来说,一个全面的列表可能太大了,但是手册很好,并且涵盖了所有这些。
现在,谈谈type的微妙之处。我预测会出现的一个混乱是:我说只有单形类型才能被命名。但是,人们可能会反对,我当然可以写。
type TypeOfIdMono a = a -> a
id :: TypeOfIdMono a看起来它已经命名为多态类型。我声称,Haskell对使forall的隐式化的倾向反而混淆了这个问题,而TypeOfId a实际上是单形的。在使用显式foralls时,已经编写了以下内容:
type TypeOfIdMono a = a -> a
id :: forall a. TypeOfIdMono a也就是说:这里我们实际上没有命名id的类型,而是只在as上操作的单纯函数的类型。id还说调用者可以选择a -也就是说,函数是多态的。比较一下这个声明,这个声明在标准Haskell中是不允许的(尽管可以通过GHC扩展获得,就像上面提到的那样):
type TypeOfIdPoly = forall a. a -> a
id :: TypeOfIdPoly这里我们确实命名了一个多态类型。
简而言之:我们可以并且应该区分三个正交概念:“参数化类型”(例如,需要附加参数的TypeOfIdMono )、提到类型变量(例如TypeOfIdMono a)的类型和必然具有forall的多态类型(例如TypeOfIdPoly)。
https://stackoverflow.com/questions/50944016
复制相似问题