プログラミング言語 Standard ML 入門 (問題の解答例)
1 MLプログラミングの基本

1.4 変数の束縛と識別子

問 1.5

以下の各々の文字列について,それが値を表す変数として使用できるか否かを判定せよ.

1stLady   name1   __   ’a   _abc   %1   123   ten%   ##’   ()   and   +   ++

さらに,実際に値の束縛を行い,判定が正しいことを確かめよ.

解答例  以下,変数としての使用が可の場合はSML#による束縛の例を,不可の場合はその簡単な説明を付す。

  • 1stLady

    不可。”1”と”stLady2”の2語である。変数束縛の位置に現れると,”1”が ”stlady”に適応されたパターン式と見なされエラーとなる。

  • name1

       # val name1 = "name1";
       val name1 = "name1" : string
    
  • __

    不可。”_”は匿名パターンを表す予約語。 ”_”が”_”に適用されたパターン式と解釈され,”_”がコンストラクターではないのでエラーとなる。

  • ’a

    不可。”’”で始まる名前は型変数にのみ使用可能。

  • _abc

    不可。”_”が”abc”に適用されたパターン式と解釈されエラーとなる。

  • %1

    不可。%1の2語と解釈される。

    ちなみに、%が1の型(int、intInfo等)を引数としてとる コンストラクタと宣言されていれば、式またはパターンとして受理される。

       # datatpe foo = % of int
       datatype foo = % of int
       # %1;
       val it = % 1 : foo
    

    そのような宣言がなければ、型エラーとなる。

  • 123

    不可。定数は変数として使用できない。ただしval 123 = 123は成功する。

  • ten%

    不可。ten%の2語と解釈される。

    ちなみに、%が型τの変数と宣言され、tenτ型を引数とする コンストラクタと宣言されていれば、受理される。

       # datatype foo = ten of string;
       datatype foo = ten of string
       # val % = "%";
       val % = "%" : string
       # ten%;
       val it = ten "%" : foo
    

    それ意外の場合、型エラーとなる。

  • ##’

    不可。”##”と”’”の2語と見なされ,”’”が型の名前に使用されていないので構文 エラーとなる。

  • ()

    不可。”()”は空の組を表す式。

  • and

    不可。”and”は予約語である。

  • +

    可能であるが,トップレベルの環境では”+”に対してinfix宣言が有効となってい るので,この宣言を取り消さないと通常の変数としては使用できない。

  • ++

       # val ++ = 1;
       val ++ = 1 : int