プログラミング言語 Standard ML 入門 (問題の解答例)
5 レコード

5.3 パターンマッチングによるレコードの操作

問 5.1

レコードパターンとフィールド取り出し演算子は,どちらか一方があれば 他を実現できる.

  1. 1.

    フィールド取り出し演算 #l と同一の型を持ち,同じ動作をする関数 式を,レコードパターンを用いて定義せよ.

  2. 2.

    レコードパターンを含む関数式 fn {l1=x1,l2=x2,,ln=xn,...} => exp と同一の型を持ち同じ動作をする関数式を,フィールド取り出し演算子を用いて定 義せよ. ただし,上記式の中のは複数のフィールドパターンを表すメタ表現, ... はMLのレコードパターンの文法の一部である. (ヒント:式expの中ではx1からxnまでの変数が使用されているはずである. この点を考えて,let val x1=exp1 val xn=expn in exp end の形の式を含む式を定義することを考えよ.ここで,expは与えられた式,exp1から expnは適当に導入する式である.)

解答例 

  • #lと同等の関数式。 SML#のレコード多相を用いれば、実際に関数として定義可能である。 以下はその例である。

       # val sharp_l = fn {l,...} => l;
       val sharp_l = fn : [’a#{l: ’b}, ’b. ’a -> ’b]
    
  • fn {l1=x1,l2=x2,,ln=xn,...} => expと同値な式。
    以下がコード例である。LaTeXMLのタイプセットの困難から、 XiLi, EXPをそれぞれ、 メタ変数xiliexpとして記述する。

       fn Y =>
         let
            val X1 = #L1 Y
            val X2 = #L2 Y
               ...
            val Xn = #Ln Y
         in
           EXP
         end