プログラミング言語 Standard ML 入門 (問題の解答例)
2 関数を用いたプログラミング

2.7 関数式

問 2.21

以上の2つの f の定義のそれぞれについて,上記の g を含むプ ログラムの評価を行い,実行時間を比較せよ.

解答例  省略。

問 2.22

int -> bool 型の関数は,与えられた整数が条件を満たすか否かを判 定する関数であるが,見方を変えれば,条件を満たす整数の集合の表現とみなすこ とができる. たとえば fn x => x = 1 orelse x = 2 orelse x = 3 は集合{1,2,3}の表現と考えることができる. ここでexp1 orelse exp2は,exp1exp2の論理和(exp1ま たはexp2)を表す構文である. exp1exp2の論理積(exp1かつexp2)を表す構文は exp1 andalso exp2である.

この見方に従い,以下の定義を与えよ.

  1. 1.

    空集合を表す関数 emptySet

  2. 2.

    整数nを受け取り,単位集合{n}を生成する関数 singleton

  3. 3.

    集合Sに要素nを加える関数 insert

  4. 4.

    要素nが集合Sに含まれるか判定する関数 member

  5. 5.

    2つの集合の和集合,積集合,差集合を計算する関数 unionintersectiondifference

解答例 

   val emptySet = fn x => false
   fun singleton n = fn x => x = n
   fun insert n S = fn x => x = n orelse S x
   fun member n S = S n
   fun union S1 S2 = fn x => S1 x orelse S2 x
   fun intersection S1 S2 = fn x => S1 x andalso S2 x
   fun difference S1 S2 = fn x => S1 x andalso not (S2 x)