15/02/19 22:31:13.58 /rXoqLFu.net
>>901
SML# という Standard ML の処理系は「ぜんぶもってる」よ
# fun get_x {X = x, ...} = x;
val get_x = fn : ['a#{X: 'b}, 'b. 'a -> 'b]
# val point_2d = {X=1.0, Y=2.0};
val point_2d = {X = 1, Y = 2} : {X: real, Y: real}
# val point_3d = {X=10.0, Y=20.0, Z=15.0};
val point_3d = {X = 10, Y = 20, Z = 15} : {X: real, Y: real, Z: real}
# get_x point_2d;
val it = 1 : real
# get_x point_3d;
val it = 10 : real
Standard ML の場合、前2つは言語仕様で規定されているからすべての処理系で利用できるけど、
最後の「フィールドがファーストクラス」であることは仕様では要求されていない
たとえば SML/NJ という処理系だと、上記のコードはエラーになる
- fun get_x {X = x, ...} = x;
stdIn:1.2-1.28 Error: unresolved flex record
(can't tell what fields there are besides #X)
SML# が独自に拡張したレコード型に関しては、SML# プロジェクトのホームページに
日本語の解説があるから、まず最初に読んでみるのがいいと思う
・SML#の拡張機能:レコード多相性 in プログラミング言語SML#解説
URLリンク(www.pllab.riec.tohoku.ac.jp)