首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Bindable实体?

Haskell Bindable实体?
EN

Stack Overflow用户
提问于 2018-06-20 08:48:44
回答 1查看 62关注 0票数 1

我看到,在约翰·威利( John,2004 )的“编程语言设计概念”( Programming Language Design Concepts )一书中,有一个关于二进制数据的定义:

“可绑定实体是可以绑定到标识符的实体。可绑定的实体种类不同,编程语言各不相同: ·C的可绑定实体是类型、变量和函数过程。 ·JAVA的可绑定实体是值、局部变量、实例和类变量、方法、类和包。 ·ADA的绑定实体包括类型、值、变量、过程、异常、包和任务。

我很好奇,Haskell里有哪些可绑定的实体?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 12:38:49

Haskell有三个名称空间,每个名称空间用于运行时计算、类型和模块。

表示运行时计算的任何术语都可以在计算命名空间中命名。datanewtype声明在计算名称空间中创建新名称,用于构造新类型的值,如果使用记录语法,则用于从新类型中选择字段。class声明在计算名称空间中为其方法创建新名称。

任何单形类型都可以在类型命名空间中使用type声明命名(请参阅下面的注释,以了解我对此语句中令人困惑的微妙之处的预测)。datanewtype声明在类型名称空间中创建新名称,用于构造它们声明的类型。class声明在类型名称空间中为它们创建的约束创建新名称。

module声明在模块命名空间中创建新名称。

GHC扩展了Haskell,添加了各种新的绑定名称的方法(几乎所有的方式都在类型名称空间中);对于这种格式来说,一个全面的列表可能太大了,但是手册很好,并且涵盖了所有这些。

现在,谈谈type的微妙之处。我预测会出现的一个混乱是:我说只有单形类型才能被命名。但是,人们可能会反对,我当然可以写。

代码语言:javascript
复制
type TypeOfIdMono a = a -> a
id :: TypeOfIdMono a

看起来它已经命名为多态类型。我声称,Haskell对使forall的隐式化的倾向反而混淆了这个问题,而TypeOfId a实际上是单形的。在使用显式foralls时,已经编写了以下内容:

代码语言:javascript
复制
type TypeOfIdMono a = a -> a
id :: forall a. TypeOfIdMono a

也就是说:这里我们实际上没有命名id的类型,而是只在as上操作的单纯函数的类型。id还说调用者可以选择a -也就是说,函数是多态的。比较一下这个声明,这个声明在标准Haskell中是不允许的(尽管可以通过GHC扩展获得,就像上面提到的那样):

代码语言:javascript
复制
type TypeOfIdPoly = forall a. a -> a
id :: TypeOfIdPoly

这里我们确实命名了一个多态类型。

简而言之:我们可以并且应该区分三个正交概念:“参数化类型”(例如,需要附加参数的TypeOfIdMono )、提到类型变量(例如TypeOfIdMono a)的类型和必然具有forall的多态类型(例如TypeOfIdPoly)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50944016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档