【问题标题】:How to print variable in sml?如何在sml中打印变量?
【发布时间】:2015-04-15 03:36:18
【问题描述】:

我是 SML 的新手,在调试时我通常会打印出变量以查看它是否符合我的预期。 我想在函数中打印出一个变量
我所拥有的是:
函数头..

let val prod 
 val prod = c + x * y;
in 
 (print "product "; prod mod 10):: (multiplyAux (prod div 10) xs y)
end;


现在它打印字符串产品,但我希望能够打印变量 prod 本身。

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    print 唯一可以打印的是字符串。所以要打印一个数值,必须先将其转换为字符串。例如:

    - print("product " ^ (Int.toString (43 mod 5)) ^ "\n");
    product 3
    val it = () : unit
    

    请注意,Int.toString 使用柯里化函数语法(即它的参数不需要元组),所以 43 mod 5 周围的括号是为了使值明确,而不是使 Int.toString 起作用。

    - Int.toString 5;
    val it = "5" : string
    

    【讨论】:

    • 我会 +1 这个,但奇怪的是“Int.toString 是一个柯里化函数”;该术语并不意味着您的想法。 (见en.wikipedia.org/wiki/Currying.)需要括号的原因是前缀函数应用的优先级高于中缀。
    • 我想你们都同意,只是表达方式不同。 Ben 有一个很好的观点,即在调用函数时不需要括号,并且您有一个很好的观点,即 Int.toString 没有被柯里化,因为它无论如何都需要一个参数(尽管所有 SML 函数都需要一个参数)。
    • @ruakh 我没有试图暗示任何事情。
    • @benrudgers:我认为我们缺少一个术语来描述这种语法变化的原因是我们也缺乏这种语法变化。你似乎在想,如果一个函数的参数是一个元组,那么这个参数是用括号表示的吗?但事实并非如此。只是元组表示法本身涉及括号。请注意,foo (bar, baz) 等效于 foo (((bar, baz)))foo { 1: bar, 2: baz }
    • (我想我的意思是——我看不出你在一元函数和咖喱函数之间看到了什么共性,而不是那些带元组的函数,这让你想要扩展“咖喱”这个词来涵盖一元函数。但即使我确实看到了,我会说试图重新利用“咖喱”这个词并不能达到传达它的目的。)
    猜你喜欢
    • 2021-06-23
    • 2010-10-21
    • 1970-01-01
    • 2010-10-19
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2017-06-19
    相关资源
    最近更新 更多