![]() |
1
6
让我们来看一个类比:函数。在数学的某些分支中,函数被称为 值构造函数 因为这就是他们所做的:你输入一个或多个值,然后他们从中构造一个新的值。 类型构造函数完全相同,除了类型级别:您放入一个或多个类型,然后它们从中构造一个新类型。在某种意义上,它们是类型级别上的函数。 现在,与我们的类比:你所问问题的类比是什么?好吧,它是这样的:“在函数编程语言中,值构造器(即函数)能被视为值吗?” 答案是:这取决于编程语言。现在,对于函数式编程语言,几乎所有(如果不是全部)语言的答案都是“是”。这取决于你对“函数式编程语言”的定义。有些人将函数式编程语言定义为一种具有值函数的编程语言,因此根据定义,答案将是微不足道的“是”。但是,有些人将函数式编程语言定义为不允许副作用的编程语言,在这种语言中,函数不一定是值。 最著名的例子可能是约翰·巴克斯的《外交政策》,来自他的开创性论文。 编程能从冯·诺依曼风格中解放出来吗?函数式及其程序代数 . 在FP中,有一个“类似功能”的层次结构。函数只能处理值,而函数本身不是值。然而,“功能”的概念是“功能构造器”,即它们可以将功能(以及值)作为输入和/或生成函数作为输出,但不能将功能作为输入和/或生成函数作为输出。 因此,fp可以说是一种函数式编程语言,但它没有函数作为值。 注:函数值也称为“一级函数”,将函数作为输入或作为输出返回的函数称为“高阶函数”。 如果我们看一些类型:
您可以看到,我们可以很容易地说:任何类型中有箭头的值都是一个函数。任何类型中有多个箭头的值都是高阶函数。
同样,这同样适用于类型构造函数,因为它们实际上是相同的,除了在类型级别上。在某些语言中,类型构造函数可以是类型,在某些语言中它们不能。例如,在Java和C中,类型构造函数不是类型。你不能有
与上面的类型示例等效的是什么?
(注意,我们总是
所以,
这些“类型类型”被称为 种类 . 与函数一样,任何带有箭头的对象都是类型构造函数,任何带有多个箭头的对象都是 高级类构造函数 . 和函数一样,有些语言允许更高类型的构造函数,有些不允许。您在问题中提到的两种语言scala和haskell 做 但是,正如上面提到的,Java和C没有。 但是,当我们看到您的问题时,会有一个复杂的问题:
不,不,至少我不懂任何语言。请参见,虽然您可以拥有更高类型的构造函数,这些构造函数将类型构造函数作为输入和/或返回它们作为输出,但您不能拥有表达式、值、变量或参数,这些表达式、值、变量或参数的类型都是类型构造函数。不能有一个函数需要
因此,很明显,类型和类型构造函数之间存在差异。 |
![]() |
2
6
好吧,类型和类型构造器有自己的微积分,它们都有类型。如果你使用
现在,您可以看到构造函数的类型
|
![]() |
3
3
至少在Haskell中,有一个可以大致描述如下的层次结构。
条款
是在运行时存在的东西,比如
每个词都有
类型
,像
每种类型都有
友善的
所有类型都有相同的类型,即
类型构造函数
还有其他种类,包括
|
![]() |
Terio · Typescript:使用变量的值创建自定义类型 2 年前 |
![]() |
Kareem Adel · 创建函数类型(TypeScript接口) 2 年前 |
![]() |
MatÄj VondráÄek · 如何在c#方法中传递类型? 2 年前 |
![]() |
kreo · 为什么&[T]参数也接受&Vec? 6 年前 |
![]() |
Jiji · 将简单对象强制转换为简单的通用接口 6 年前 |