答案 0 :(得分:14)
这个答案并不十分准确,但无论如何我都会发布它。
...介于数据和计算之间。
数据的基本属性是它具有结构。数据可以作为输入传递,并通过计算作为输出返回。数据结构可以通过计算使用。但是,数据本身并没有做任何事情。 的数据是。
数据类型的示例是布尔值,数字,字符串,代数数据类型(标记的联合)等。相应地,值的示例是false
, 2
,"pyon"
,SOME 2
。计算操作值是有意义的:例如,计算可以分支,具体取决于数字是偶数还是奇数。但是,询问值可以做什么没有意义:数字2不能做任何事情,只是。
计算的基本属性是它们具有行为。换句话说,计算做。但是,计算“太活跃”而无法传递或存储在变量中。例如,您无法在变量中存储打印“Hello,world!”的行为。到了屏幕。
您可能反对在变量中存储对函数的引用。但是对函数的引用与函数执行时的行为并不完全相同!前者是数据,后者是计算。
什么是codata?在给出正确的定义之前,我将使用一个例子:
Streams是codata
什么是流?流是 1 的参考,在执行时产生的计算:
序列的第一个元素(“head”),以及逻辑上是序列其余部分的另一个流(“tail”)。或...
表示序列结束的特殊符号(“nil”)。
Streams(更常见的是,codata)是数据,因为它们是对计算的引用,而不是计算本身。然而,使流(以及更一般地说,codata)特殊的原因在于,当执行基础计算时,它们可能会产生其他流(更常见的是,codata)。
现在我终于可以给出一个正确的定义:
Codata是对计算的引用,当执行时,可能会产生(除此之外)更多的codata。
1 正确的技术术语是“thunk”,而不是“reference”。