「変数の初期化」「変数の再代入禁止」

プログラミング言語Haskellを説明するとき,説明の相手がCプログラマであれば,その人が知っているであろう概念を使って説明する方がわかりやすい.と考える心情はわからないわけではない.

  • Haskellでは変数の初期化は一度しかできない
  • Haskellでは変数は一度だけ代入(assign)が可能で,再代入(re-assign)して変数の値を初期値から変更することはできない

などという説明を見ることがある.この説明はHaskellプログラムのある一面を描写していて,いくつかの前提を明示すれば,まちがいではないように思えるし,許容できる説明だとも思えなくもなかった.しかし,今は寛容の心が持てないジジイになってしまった.Haskellにはアドレス空間あるいは値の記憶場所という概念はなく.代入(assignment)の概念もなければ初期化の概念もない.

 x = 4200 * 1.05

= は代入(assignment)ではなく,束縛(binding)である.すなわち右辺の式が表す値で左辺の変数を束縛するのである.この場合は変数 x を式 4200 * 1.05 が表す値で束縛するのである.最初の2つの説明は,

  • Haskellでは変数は(同じ有効範囲では)一度しか束縛できない.
  • Haskellでは変数は一度だけしか束縛できず,(同じ有効範囲で)再度束縛して変数が表す値を変更することはできない.

とすべきであると頑なに思うようになってしまった.