15/02/21 00:55:59.35 KgB/c0aN.net
>>906
Standard ML のレコード型は構造的部分型関係を持たないよ
構造的部分型関係を持つレコード型に類する型を持つのは OCaml や Java
いわゆるオブジェクト指向におけるクラスとそれらの間の継承関係のこと
また「多相レコード型」という用語の意味が「パラメタ型多相なレコード型」
であるならば、Standard ML は多相レコード型を持つことになる
ここでパラメタ型多相は、Java だとジェネリクス(総称型)と呼ばれている
結論として、Standard ML(とその処理系 SML/NL および SML#)は1と3を満たす
次にファーストクラスについて、>>902 のコードにおける関数 get_x の定義だけど、
「フィールドとはレコード値からフィールド値への写像(関数)である」
という関係に気付けば、その定義は以下のように簡潔になる
# val get_x = #X;
val get_x = fn : ['a#{X: 'b}, 'b. 'a -> 'b] (* SML/# *)
つまりフィールド #X は(val宣言で)識別子に束縛したり、他の関数へ適用したり。
ある関数の評価結果として返すことができる
こうした数値や文字列といった値と同等に扱える性質を指してファーストクラスと呼ぶ
さらに上記の例は SML# だけど、SML/NJ も型システムが単純たから型推論に失敗するだけで、
データ型を明示的に宣言すれば関数 get_x を定義できる
- val get_x = #X : {X: real, Y: 'a} -> real;
val get_x = fn : {X:real, Y:'a} -> real (* SML/NJ *)
型システムの制約とファーストクラスという性質をごっちゃにすべきではない
まとめると、Standard ML(とそのすべての処理系)のフィールドはファーストクラスである