28

私はよくHaskellに変数がないという主張を聞いてきました。特にthis answerはそれがないと主張し、少なくとも9回upvotedされ、受け入れられました。Haskellには変数がありますか?

それには変数があるかどうか、そしてその理由は何ですか?

この質問は、ML、F#、OCaml、Erlang、Oz、Lava、およびすべてのSSA中間言語を適用するようにも見えます。

答えて

47

Haskellは、デフォルトで不変変数(数学の意味での変数)を持つ:デフォルトの変数によって

foo x y = x + y * 2 

変更可能な細胞ではありません。

Haskellはまた、しかし、可変セルを有していますが、明示的に有効にします。

> v <- newIORef 0 
> readIORef v 
0 

> writeIORef v 7 
> readIORef v 
7 

ので、YES Haskellは本当の変数があります。しかし、デフォルトでは可変変数は使用されません。

4

はい、Haskellには変数があります。 nが可変である、これらの両方の場合において

inc n = n + 1 
inc = \n -> n + 1 

を定義(本質的に等価)を考えます。異なる時間に異なる値をとることになります。 Haskell ReportSection 3)は、これらを明示的に変数と呼んでいます。

inc n = n + 1 
f = inc 0 
g = inc 1 
main = print (f+g) 

印刷答えはもちろん「3」、次のようになります。ここでnは、変数は、我々は、以下の完全なプログラムを検討するかどうかを確認する方が簡単かもしれであることを

fを評価するときに、を展開すると、0の値をとり、後で(またはそれ以前)はgと評価されます。展開すると、incxの値は1になります。

問題に記載されている他の言語と同様に、Haskellは単一割り当て言語であるため、混乱が生じる可能性があります。スコープ内の変数の再割り当ては許可されません。 nに値42が割り当てられると、新しいn(これは別の変数で、もう1つはシャドウイングのn)が別の値にバインドされた新しいスコープを導入しない限り、42を超えることはできません。

これは、このようなdoを使用して表現など、いくつかの状況で完全に明らかではないかもしれません。

do let n = 1 
    print n 
    let n = 2 
    print n 

いますが、doずにHaskellの中にそれを翻訳し、糖衣構文を削除した場合、あったことが明らかになり、

(let n = 1 
    in (print n >> (let n = 2 
        in print n))) 
+1

にハスケルには変数がありません!変数は、何が機能したりしましょうバインディングを持っていることは不変の機能に過ぎない。再割り当てすることができます引数には名前にバインドされた値があります! – Dario

+6

Dario、wikipediaには、すべての変数が単一代入の9つの言語と、単一代入がオプションの別の5つの言語がリストされています。http://en.wikipedia.org/wiki/さらに、この用語を思いついた数学者も、単一割り当ての意味で変数を使用しています。これに対して反対するつもりなら、これが間違ったビューである理由を示す詳細な回答を投稿するのはどうですか? –

3

:その内側の範囲内nは、外側のスコープでnをシャドウイングされる別の変数で作成された新しい、ネストされた範囲"Haskellには変数がないと聞いたことがあります。これは本当です「

No

。 "だから、それは変数を持っていたりしません、そしてなぜ"

Yes.

EDIT:??私の答えがある、二重否定の原因は、身体が動かないうちにヘッドラインの質問が陽性であるため自然に混乱します:)

EDIT2:OPが質問を変更したため、再度編集しました。

+1

y答えた質問を引用してください。今、私はこの質問を「Haskellに変数がありますか?私が見る最初の答えは "いいえ"です。 (明らかに、私は完全な質問を実際には読んだわけではなく、ただのタイトルです。) –

8

単純な答えは:はい、HaskellにはSection 3.2 of the Haskell Reportで定義された変数があります。変数はパターンで表示することができ、let,case、リスト内包表記などの構文を使用して値にバインドすることができます。

おそらく、あなたの疑問に暗黙のうちに、変数が不変であれば、変数が適切に変数と呼ばれるかどうかということです。私は他の答えが十分に変異性をカバーしていると思います。

3

は[ウィキペディア(http://en.wikipedia.org/wiki/Variable_(programming))によれば、はい、Haskellは変数有する:コンピュータプログラミングの

を、変数は、システムのメモリに格納された値にリンクされている識別子(通常、文字または単語)であります
一般的なプログラミング言語では、値は一般的にいつでもアクセスまたは変更することができますが、純粋な形では評価することはできません。関数型と論理型の言語では、変数は式にバインドされ、 r参照透過性の要件のために全寿命。命令型言語では、通常は通常の変数と対比される定数によって同じ振る舞いが示されます。

もちろん、すべてのウィキペディアの定義は完全に信頼できるものではありません。

ページ[数学的変数](http://en.wikipedia.org/wiki/Variable_(mathematics))このさらなる洞察を提供することができる。

関連する問題