束縛のスコープ

それぞれの束縛は、それが有効である固定のスコープを持っています。 ファイルの中にあるトップレベルの束縛のスコープは束縛が作られた場所からファイルの終端までです。 次の例では letin キーワードの間で束縛が作られていて、 その束縛は end キーワードまで有効です。

val area = let val PI = 3.14 and radius = 10.0 in PI * radius * radius end // end of [let]

このような束縛はローカル束縛と呼ばれていて、 PIradius のような名前はローカル名と呼ばれています。 この例は以下のようなスタイルでも書くことができます。

val area = PI * radius * radius where { val PI = 3.14 and radius = 10.0 // simultaneous bindings } // end of [where] // end of [val]

式の直後に現われるキーワード where は、 その式に含まれている名前を評価するためのみ有効な束縛を表わしています。 しばしば、キーワード letwhere を使って構成された式は、それぞれ let 式と where 式と呼ばれます。 前者はかならず後者に変換でき、また逆にもかならず変換できます。 どちらがより良いスタイルなのでしょうか? 私はまだ自分の意見を持っていません。 その答はプログラマの好みに完全に依存していると思われます。

次の例はローカル束縛を作るまた別のアプローチを示しています。

local val PI = 3.14 and radius = 10.0 in (* in-of-local *) val area = PI * radius * radius end // end of [local]

キーワード localin の間で作られた束縛は、 キーワード end に逹っするまで有効です。 inendの間で作られた束縛は、 トップレベルの束縛になることに注意してください。 letlocal の違いは明確です。 前者は式を構成するのに使い、後者は宣言を列挙するのに使います。