Языки с неизменяемыми переменными по умолчанию, такие как Haskell

#haskell #functional-programming #referential-transparency

#haskell #функциональное программирование #ссылочный-прозрачность

Вопрос:

одна вещь, которую я нахожу интересной в Haskell, — это то, что функции и переменные одинаковы. В большинстве языков переменная хранит значение, пока функция что-то делает, а затем, в конечном итоге, возвращает значение. В Haskell вы не видите этой разницы, и после использования Haskell возврат к более «традиционному» программированию, где переменные отличаются от функций или методов, кажется неудобным. Если я хочу получить значение, мне не стоит беспокоиться о его происхождении, будь то постоянное значение, изменяемая переменная или результат сложного вычисления! В Haskell переменные — это просто 0-арные функции.

Многие объектно-ориентированные языки обладают свойствами, в которых ощущается некоторый пробел.

Кто-нибудь может указать какой-либо другой язык с системой, подобной Haskell? Я думал, что это характерно для функциональных языков из-за ссылочной прозрачности, но я видел, что это не так. В Lisp, например, вы должны (defun) явно объявлять функции.

Комментарии:

1. В Haskell f x = x это то же самое, что f = x -> x , поэтому = ` is sort of the same as defun`. В Haskell функции и переменные одинаковы, но они также и не являются таковыми.

2. Я бы сказал, что функции — это просто значения, но есть и другие вещи, которые тоже являются значениями.

3. Черт возьми, функции и переменные не совпадают в Haskell. (Пожалуйста, прочтите сообщение Конала Эллиота, conal.net/blog/posts/everything-is-a-function-in-haskell )

4. «Функция» — это семантическое понятие, в то время как «переменная» — синтаксическое понятие. И, как сказал Луки, все значения функций и нефункциональные значения являются значениями (а не переменными). Некоторые переменные имеют функциональный тип, а некоторые переменные не имеют функционального типа.

5. Джонатан: спасибо за плагин. И в моей фамилии две буквы «т».

Ответ №1:

Кто-нибудь может указать какой-либо другой язык с системой, подобной Haskell?

Несколько языков имеют неизменяемые переменные (т.е. переменные в математическом смысле) по умолчанию:

  • Haskell (очевидно),
  • Очистить,
  • Erlang,
  • ML.

Другие поощряют такое поведение с помощью объявлений ‘const’ или ‘val’ (Scala, C).

Во многих функциональных языках изменяемые значения могут быть введены только через явные объявления ‘ref’ или ‘var’.

Ответ №2:

В Clojure defn — это просто макрос для определения. Переменные являются неизменяемыми и содержат значения. Функции — это просто значения, как и любой другой вид значений. Имеет ли значение на самом деле является функцией (FN) — это не важно, так ли это тип значения, которое реализует функции интерфейса (ИФН).

Чтобы прояснить последний момент, примитивный массив Java не является функцией. Возможно, я захочу обработать это как последовательность Clojure, я мог бы создать тип оболочки, который позволит мне представить этот интерфейс (ISeq) поверх примитивного массива. Я мог бы также реализовать тип оболочки IFn, и тогда примитивный массив также можно было бы рассматривать как функцию.

 (def x (wrap-prim-array ...))

(nth x 0) ; idiomatic random access
(x 0)     ; used as a function
  

Ответ №3:

Не забывайте Javascript.

 var a = function(x) { return (x   1) };
var b = a(1);
// b == 2 here.
  

совершенно законно.

Комментарии:

1. Не мои отрицательные отзывы, но переменные Javascript не являются неизменяемыми по умолчанию, что было основной целью вопроса.

2. Я почти уверен, что вопрос редактировался так часто, что этот ответ больше не подходит. Я согласен с голосами против, учитывая новый вопрос, но я почти уверен, что ответил на совсем другой вопрос.

3. Да, просмотр изменений показывает следующую очень существенную правку в названии этого вопроса. Раньше заголовок вопроса был «Равенство функций и переменных типа Haskell», который я принял за вопрос о функциях первого класса. Кстати, у меня отношения любви / ненависти к JavaScript, но чисто любовные отношения с Haskell. Это по-прежнему мой любимый язык программирования.