makestringは、Standard ML の初期のドラフトの一部に存在していましたが、最終バージョンの前に削除されました。Poly/ML はこれをPolyML.makestringとして保持し、これは構造化型を含むあらゆる型で機能します。
この特定の例では、次のように書くことができます
fun assert(testName, actual, expect) =
if actual = expect
then true
else raise AssertionErrorException(testName ^ " failed. actual: " ^
PolyML.makestring actual ^ ", expect: " ^
PolyML.makestring expect);
そう
assert("test1", SOME [], NONE);
版画
Exception-
AssertionErrorException "test1 failed. actual: SOME [], expect: NONE"
raised
実際の型と期待される型は等価型であり、これによりコンパイラに値を適切に出力するのに十分な情報が提供されるため、これはたまたま機能します。ただし、通常、PolyML.makestringがポリモーフィック関数に含まれている場合、出力されるのは「?」だけです。解決策は、特定の型を文字列に変換する関数である追加のパラメーターを渡すことです。
fun assert(testName, actual, expect, toString) =
if actual = expect
then true
else raise AssertionErrorException(testName ^ " failed. actual: " ^
toString actual ^ ", expect: " ^ toString expect );
次に、特定の値を文字列に変換する関数を渡す必要があります。Poly/ML では、これはPolyML.makestringになります。
assert("test2", (1,2,3), (1,2,4), PolyML.makestring);
版画
Exception-
AssertionErrorException
"test2 failed. actual: (1, 2, 3), expect: (1, 2, 4)" raised
別の SML 実装を使用している場合でも、同じことを行い、特定の型に対して独自の変換関数を渡すことができます。
assert("test2", (1,2,3), (1,2,4),
fn (a,b,c) =>
String.concat["(", Int.toString a, ",", Int.toString b,
",", Int.toString c, ")"]);
実際には、前の回答で説明した型クラスを実装しています。