#functional-programming #programming-languages
#функциональное программирование #программирование-языки
Вопрос:
Какой язык программирования имеет значение, которое выражаемо, но не обозначаемо. Также, что бы это значило? Я действительно не понимаю разницы. На данный момент я думаю, что это означает функциональный язык, потому что тогда вы не можете присваивать переменным значения, только указывающие на них? Это совершенно неправильно?
Комментарии:
1. Я рад, что ваш вопрос краток, но, возможно, слишком краток. Не могли бы вы также кратко процитировать свой источник? Это могло бы помочь, если бы мы увидели использование в контексте. Используя «>», вы можете заключить в кавычки следующим образом: > Veni, vidi, vici.
2. К сожалению, это из экзаменационной работы, поэтому дополнительной информации нет.
3. Фактическим ответом были универсальные типы Java и wildcard. Вы можете определить выражение типа, но вы не можете использовать имя для ссылки на этот тип.
Ответ №1:
Согласно этим конспектам лекций Дэвида Шмидта:
Выражаемые значения — это значения, которые могут быть получены с помощью выражений в коде, таких как строки, числа, лямбды / анонимные функции (на языках, которые их поддерживают) и т.д.
Обозначаемые значения — это значения, которым можно присвоить имя (привязать к идентификатору) и ссылаться на них позже, подобно значениям переменных или именованных функций.
Например, язык может иметь синтаксис для объявления именованных функций, но не иметь синтаксиса выражения для анонимных функций. Итак (если я правильно понимаю), на этом языке функции были бы обозначаемыми, но не выражаемыми.
Единственный пример, который я смог найти для значений, которые можно выразить, но нельзя обозначить, — это значения ошибок (в некоторых теоретических языках стр.11), которые могут быть получены выражением (например 1/0
), но не могут быть привязаны к идентификатору (сохраненному в переменной). (Предполагается, что оператор присваивания распространяет ошибку вместо простого сохранения значения ошибки в переменной.)
Анонимные типы также в чем-то похожи. Например, в C # вы можете определить анонимный объект, который имеет анонимный тип, который не может быть привязан к идентификатору (не обозначается):
// anonymous objects can only be saved into a variable by using type inference
var obj = new { Name = "Farah", Kind = "Human" };