Выразительные против денотируемых значений - PullRequest
1 голос
/ 30 марта 2019

Какой язык программирования имеет значение, которое может быть выражено, но не обозначено. И что бы это значило? Я не очень понимаю разницу. На данный момент я думаю, что это означает функциональный язык, потому что тогда вы не можете дать значения переменных только указать на них? Это совершенно неправильно?

1 Ответ

0 голосов
/ 02 апреля 2019

Согласно этим лекционным заметкам Дэвида Шмидта:

Выразимые значения - это значения, которые могут быть получены с помощью выражений в коде, таких как строки, числа, лямбда-выражения / анонимные функции (на языках, которые их поддерживают) и т. Д.

Значения, помеченные как - это значения, которые могут быть названы (привязаны к идентификатору) и переданы позже, например значения переменных или именованных функций.

Например, язык может иметь синтаксис для объявления именованных функций, но не иметь синтаксиса выражений для анонимных функций. Поэтому (если я правильно понимаю) на этом языке функции будут денотируемыми, но не выразимыми .

Единственный пример, который я смог найти для значений , которые выразимы, но не могут быть помечены являются значениями ошибок в некоторых теоретических языках 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" };
...