可表达与可表示的价值

Expressible vs denotable values

哪种编程语言具有可表达但不可表示的价值。还有这意味着什么? 我真的不明白其中的区别。目前我认为它意味着一种函数式语言,因为那样你就不能给变量值只指向它们? 这是完全错误的吗?

根据大卫·施密特 these lecture notes 的说法:

可表达的值 是可以通过代码中的表达式产生的值,例如字符串、数字、lambdas/anonymous 函数(在支持它们的语言中)等

可表示的值 是可以命名(绑定到标识符)并在以后引用的值,例如变量或命名函数的值。

例如,一种语言可以有声明命名函数的语法,但没有匿名函数的表达式语法。所以(如果我理解正确的话)在这种语言中,函数将是 可表示但不可表达的 .

我能找到的 可表达但不可表示的唯一示例是错误值(在some theoretical languages p.11),它可以由表达式(如1/0)生成,但不能绑定到标识符(保存在多变的)。 (假设赋值语句传播错误而不是简单地将错误值存储在变量中。)

匿名类型也有些相似。例如在 C# 中,你可以定义一个匿名对象,它有一个不能绑定到标识符的匿名类型(不可表示):

// anonymous objects can only be saved into a variable by using type inference
var obj = new { Name = "Farah", Kind = "Human" };