35

Haskellには変数がないという主張をよく耳にします。特に、この回答はそうではないと主張しており、少なくとも9回賛成され、受け入れられました。

それで、それは変数を持っているかどうか、そしてなぜですか?

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

4

5 に答える 5

57

Haskell には、デフォルトで不変変数 (数学的な意味での変数) があります。

 foo x y = x + y * 2

デフォルトでは、変数は可変セルではありません。

Haskell には変更可能なセルもありますが、明示的に有効にします。

 > import Data.IORef (newIORef, readIORef, writeIORef)
 > v <- newIORef 0
 > readIORef v
 0

 > writeIORef v 7
 > readIORef v
 7

つまり、YES Haskell には真の変数があります。ただし、デフォルトでは変更可能な変数は使用されません。

于 2009-06-14T21:19:08.163 に答える
10

簡単な答えは次のとおりです。はい、HaskellにはHaskellレポートのセクション3.2で定義されている変数があります。変数はパターンで表示できるため、、、、リスト内包表記などletの構造を使用して値にバインドできます。case

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

于 2009-06-14T22:12:41.527 に答える
9

はい、Haskellには変数があります。(本質的に同等の)定義を検討する

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

どちらの場合も、nは変数です。それは異なる時間に異なる値を取ります。セクション3Haskellレポートでは、これらを明示的に変数として参照しています。

ここnにある変数は、次の完全なプログラムを検討すると見やすくなる可能性があります。

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

もちろん、答えは「3」になります。を評価するときfは、展開inc xすると値を取り、0後で(またはそれ以前に!)評価するときgは、展開inc xすると値を取ります1

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

doこれは、 :を使用した式など、一部のコンテキストでは完全に明らかではない場合があります。

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

しかし、シンタックスシュガーを削除し、それをなしでHaskellに変換するとdo、新しいネストされたスコープが作成され、その内側のスコープが外側のスコープnをシャドウイングしている別の変数であることが明らかになります。n

(let n = 1 
  in (print n >> (let n = 2
                   in print n)))
于 2009-06-14T16:16:17.827 に答える
4

[Wikipedia]( http://en.wikipedia.org/wiki/Variable_(programming))によると、Haskell には変数があります。

コンピュータ プログラミングでは、変数は識別子 (通常は文字または単語) であり、システムのメモリに格納されている値または評価可能な式にリンクされています。たとえば、変数は「total_count」と呼ばれ、数値を含む場合があります。
命令型プログラミング言語では、通常、いつでも値にアクセスしたり変更したりできます。ただし、純粋な関数型および論理型の言語では、変数は式にバインドされ、参照透過性の要件により、その存続期間全体で単一の値を保持します。命令型言語では、同じ動作が定数によって示されます。これは通常、通常の変数とは対照的です。

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

[数学変数]( http://en.wikipedia.org/wiki/Variable_(mathematics))のページは、これに関するさらなる洞察を提供するかもしれません。

于 2009-06-15T01:05:47.523 に答える
2

「Haskellには変数がないと聞いたことがあります。これは本当ですか?」

いいえ

「それで、それは変数を持っているかどうか、そしてなぜですか?」

はい。

編集:私の答えは二重否定を引き起こしますが、見出しの質問は肯定的ですが、本文は肯定的ではないため、当然混乱します。:)

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

于 2009-06-14T16:16:28.263 に答える