web-dev-qa-db-ja.com

Haskellには変数がありますか?

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

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

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

31
Curt J. Sampson

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には真の変数があります。ただし、デフォルトでは可変変数を使用しません。

51
Don Stewart

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

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

9
Chris Conway

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

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

どちらの場合も、nは変数です。それは異なる時間に異なる値を取ります。 Haskell Report 、in Section は、これらを明示的に変数として参照します。

ここで変数nを変数にすると、次の完全なプログラムを検討すると、より簡単に確認できます。

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

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

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

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

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

しかし、構文糖を削除して、doなしでHaskellに変換すると、内部スコープのnが外部スコープのnをシャドウしている別の変数である、ネストされた新しいスコープが作成されたことが明らかになります。

(let n = 1 
  in (print n >> (let n = 2
                   in print n)))
5
Curt J. Sampson

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

いいえ

「それで変数があるかどうか、そしてなぜですか?」

はい

編集:私の答えはダブルネガティブを引き起こします、それは自然に混乱しています。 :)

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

3

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

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

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

[数学変数]( http://en.wikipedia.org/wiki/Variable_(mathematics)) のページで、これについてさらに洞察を得ることができます。

3
Curt J. Sampson