#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. Это по-прежнему мой любимый язык программирования.