默认情况下不可变的编程语言是什么?

30

有没有一些编程语言中的“变量”默认为不可变(const、final等)?

而且,如果要让它是可变的,你需要声明一个额外的不可变限定符吗?


我问这个问题是因为我使用C/C++编程,我注意到我几乎在声明所有变量时都加上const前缀。因此,如果有一些语言默认将所有内容设置为const,那就太好了;这可以节省我的手腕和手指的力气。;-) - sivabudh
2
转向 .Net;你知道你想要的。 - Hamish Grubijan
2
@Hamish -- 我非常渴望摆脱C++。在这上面工作了5年以上后,我渴望提高生产力,并享有在C#和Java中发现的随语言附带的有用框架的特权。 - sivabudh
6个回答

39

函数式编程 范式的哲学倾向于所有“变量”都是不可变的,并且只有在极端情况下(即用于I/O)才允许“可变”变量。 因此,大多数函数式编程语言(如各种Lisp方言和Haskell)通常会强化不可变变量。 当然,一些语言比其他语言提供更多的灵活性,但中心范式/哲学仍然是不鼓励它。


编辑:针对你的编辑回复:

如果你正在寻找一个带有友好常量的C语言,那么采用全新的编程范式并不是你的解决方案。在函数式编程中,一切都是不可变的(在大多数情况下),你通常会看到一个全新的基本哲学和编程方法。

如果你只是想要更容易地声明常量,那么这 并不是 真正的解决方案。


编辑2:针对给我点赞的人:

虽然我希望我已经正确地回答了提问者的问题,但考虑到他的新编辑/评论,我不确定这个答案是否会有用。然而,我可以希望可能向他展示一个全新美丽的编程世界 =)


编辑3:这是维基百科的列表功能性编程语言:

  • APL
  • Charity(纯函数式)
  • Clean(纯函数式)
  • Curl
  • Curry
  • Erlang
  • F#
  • Haskell(纯函数式)
    • CAL
  • Hop
  • J
  • Joy
  • Kite
  • Lisp
    • Clojure
    • Common Lisp
    • Dylan
    • Little b
    • Logo
    • Scheme
    • Tea
  • Lush
  • Mathematica
  • Miranda
  • ML
    • Standard ML
    • Alice
    • Ocaml
    • Mythryl
  • Nemerle
  • Opal
  • OPS5
  • Poplog
  • R
  • Q
  • REFAL
  • Russell
  • Scala
  • 电子表格

这些语言中大多数都有一些非函数式异端的小元素/影响;标记为“纯函数式”的则没有。

据我所知,函数式编程语言是唯一通过哲学鼓励使用不可变变量的语言。可能有一些语言默认情况下具有不可变变量,但它们并非基于函数式编程范式。这个概念对我来说听起来相当奇怪,但考虑到存在大量的编程语言,我不能保证绝对不会出现这种情况。我只能说,据我所知,这种情况极不可能发生。
一位评论者指出,ADA是一种命令式/面向对象编程语言,具有默认的不可变变量。

1
我会减弱关于Lisp的评论。一些 Lisp方言是不可变的 - 大多数不是。 - porges
4
Scala 和 Ada 也需要明确说明变量是否可变。 - sarnold
添加了一个列表 =) 此外,按照Porges的要求澄清了Lisp的松散程度。 - Justin L.
1
我已经有5年没有使用Ada编程了,但是我不知道之前的评论是关于什么的。在这里可以看到声明Ada变量(和常量)的示例:http://www.seas.gwu.edu/~csci51/fall99/ada_note.html#variable_types - KeyserSoze
以及 Elixir,它是建立在 Erlang 之上的。 - jiyinyiyong
显示剩余4条评论

7

是的。

Haskell和Erlang就是两个例子。


6
我能想到的最接近的相似之处是Objective Caml。由let绑定的变量始终是不可变的,但结构的字段(Caml中称为记录)默认情况下仅是不可变的,也可以将单个字段标记为mutable
在功能语言中,Objective Caml对C程序员非常有吸引力。OCaml在语言和库中具有相当多的命令式结构,因此迁移路径并不那么陌生。如果您真的需要对象和类系统,它们也在那里。
Microsoft的.NET语言F#是Objective Caml的一个后代,但已经进行了很多更改,以确保它是一个.NET语言,我不了解其可变性。但如果您想尝试一种功能性语言作为当前编程风格的相对小的改变,您可能希望调查Objective Caml或F#。

6

Clojure是一种Lisp方言,专门处理不可变数据,并针对Java虚拟机进行优化。

http://www.clojure.org


1
Clojure的哲学在我看来是最大化不可变数据,但必要时使用可变引用。数据突变的问题在于安全性和并发性,但Clojure有STM使引用的变异变得安全。 - ewernli
2
@ewerli> 我认为你误解了Clojure中不可变性的概念。Clojure的作者Rich Hickey在这个主题演讲中深入阐述了不可变性背后的概念:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey - mtgred
@HamishGrubijan 但是Clojure是Lisp方言,而F#基于ML。两者都没有压倒另一个的能力。 - Andres F.

5
Rust可能是你想要了解的一种语言。它是一种命令式风格的语言,遵循函数式编程哲学,有时会让人惊讶地

4

XSLT中的所有变量都必须是不可变的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接