Языки с неизменяемыми переменными по умолчанию, такие как Haskell - PullRequest
3 голосов
/ 14 апреля 2011

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 апреля 2011

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

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

  • Haskell (очевидно),
  • Clean,
  • Erlang,
  • ML.

Другие поощряют этоповедение через объявления 'const' или 'val' (Scala, C).

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

1 голос
/ 14 апреля 2011

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

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

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

(nth x 0) ; idiomatic random access
(x 0)     ; used as a function
0 голосов
/ 14 апреля 2011

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

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

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

...