gpt4 book ai didi

sml - 如何在 SML 中将任何内容转换为字符串?

转载 作者:行者123 更新时间:2023-12-02 11:25:28 24 4
gpt4 key购买 nike

如果它们不相等,我正在尝试实现一个测试函数来比较和显示错误消息:

exception AssertionErrorException of string

fun assert(testName, actual, expect) : bool =
if actual = expect
then true
else raise (AssertionErrorException (testName ^ " failed. actual: " ^ actual
^ ", expect: " ^ expect ));

不幸的是,如果我使用非字符串参数调用它,它就不起作用:
assert("test1", SOME [], NONE);

无法编译,报错信息为:
Error: operator and operand don't agree [tycon mismatch]
operator domain: string * string * string
operand: string * 'Z list option * 'Y option
in expression:
assert ("test1",SOME nil,NONE)

如何解决?

最佳答案

makestring 出现在标准 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

这碰巧有效,因为actual 和expect 的类型是相等类型,这为编译器提供了足够的信息来正确打印值。但是,一般而言,如果 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, ")"]);

实际上,您正在实现上一个答案中描述的类型类。

关于sml - 如何在 SML 中将任何内容转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com