プログラミング言語 Standard ML 入門 (問題の解答例)
5.3 パターンマッチングによるレコードの操作
問 5.1
レコードパターンとフィールド取り出し演算子は,どちらか一方があれば 他を実現できる.
-
1.
フィールド取り出し演算
#
と同一の型を持ち,同じ動作をする関数 式を,レコードパターンを用いて定義せよ. -
2.
レコードパターンを含む関数式 fn {=,=,,=,...} => と同一の型を持ち同じ動作をする関数式を,フィールド取り出し演算子を用いて定 義せよ. ただし,上記式の中のは複数のフィールドパターンを表すメタ表現, ... はMLのレコードパターンの文法の一部である. (ヒント:式の中ではからまでの変数が使用されているはずである. この点を考えて,let val = val = in end の形の式を含む式を定義することを考えよ.ここで,は与えられた式,から は適当に導入する式である.)
解答例
-
•
#lと同等の関数式。 SML#のレコード多相を用いれば、実際に関数として定義可能である。 以下はその例である。
# val sharp_l = fn {l,...} => l; val sharp_l = fn : [’a#{l: ’b}, ’b. ’a -> ’b]
-
•
fn {=,=,,=,...} => と同値な式。
以下がコード例である。LaTeXMLのタイプセットの困難から、 Xi、 Li, EXPをそれぞれ、 メタ変数、、として記述する。fn Y => let val X1 = #L1 Y val X2 = #L2 Y ... val Xn = #Ln Y in EXP end