我试图让SML/NJ在顶层打印出一个结果,而不是在任何地方放置#符号.
根据一些旧的文档(以及2001年该新闻组的帖子),应该可以使用 Compiler.Control.Print.printDepth
但是,在SML/NJ版本110.7上,这只是一个错误:
- Compiler.Control.Print.printDepth := 100;
stdIn:1.1-30.8 Error: unbound structure: Control in path Compiler.Control.Print.printDepth
Run Code Online (Sandbox Code Playgroud) 问题很简单.
如何在SML中使用Index变量访问元组?
val index = 5;
val tuple1 = (1,2,3,4,5,6,7,8,9,10);
val correctValue = #index tuple1 ??
Run Code Online (Sandbox Code Playgroud)
我希望,有人可以帮忙.提前致谢!
我(从SML书中)了解到,SML中的函数总是只有一个参数:一个元组.带有多个参数的函数只是一个函数,它将一个元组作为参数,在函数绑定中使用元组绑定实现.我理解这一点.
但在此之后,这本书说了一些我不理解的东西:
this point makes SML language flexible and elegant design, and you can do something useful that you cannot do in Java.
为什么这种设计使语言变得灵活?什么是文本指的是,SML可以但java不能?
我正在尝试创建一个派生函数来区分使用数据类型,如下所示:
datatype Symex = RCOEFF of real
| COEFF of string
| VAR of string
| POWER of Symex * int
| NEG of Symex
| PLUS of Symex * Symex
| MINUS of Symex * Symex
| MULT of Symex * Symex
| DIVIDE of Symex * Symex
Run Code Online (Sandbox Code Playgroud)
这是*x ^ 3 + 4.0*x ^ 2 + b*x + c的示例
PLUS (MULT (COEFF ("a"),
POWER (VAR ("x"), 3)),
PLUS (MULT (RCOEFF (4.0),
POWER (VAR ("x"), 2)),
PLUS (MULT (COEFF ("b"), …Run Code Online (Sandbox Code Playgroud) 我有在SML两个列表,可以说,名单A [(a,b,c),(d,e,f)]和B名单[b,e].我想计算B中与B中每个三元组的第二个元素匹配的每个项目的出现次数.输出应该是2.因为b并且e每个在A中出现一次.
到目前为止这是我的代码,但是当我从B中的一个元素移动到另一个元素时,我的计数器总是设置为0.我知道在Java中这只是一个简单的双循环.
fun number_in_months (d : (int * int * int ) list, m : (int) list) =
if null m then 0
else if null d then number_in_months(d, tl m)
else if (#2(hd d)) = (hd m) then 1 + number_in_months (tl d, m)
else number_in_months(tl d, m)
Run Code Online (Sandbox Code Playgroud) 我们的教授要求我们在作业中这样做:
\n\n\n\n\n如果给定的阈值为负,则应打印消息 \xe2\x80\x9cError: Negative Threshold\xe2\x80\x9d 并返回空列表。为此,需要 de\xef\xac\x81ne 一个名为 ThresholdOutOfRange 的异常,如果阈值为负则引发该异常,并处理该异常以实现正确的行为。
\n
我不明白如何引发异常、返回值和打印错误消息。现在我引发异常的代码是(只是有异常的重要部分):
\n\nfun getnearbylist(center, threshold, ziplist) =\n let\n exception ThresholdOutOfRange;\n fun test_threshold(threshold, zip, nil) =nil\n | test_threshold(threshold, zip, ziplist as x::xs) =\n if (threshold <0.0) then raise ThresholdOutOfRange\n(* [...skipped a long unrelated middle bit. most important is just knowing\n this function returns a string list...] *)\n else x::test_threshold(threshold, zip, xs)\n in\n test_threshold(threshold, center, ziplist)\n handle\n ThresholdOutOfRange => []\n end\nRun Code Online (Sandbox Code Playgroud)\n\n因此,当引发异常时,我的代码将仅返回一个空列表。鉴于据我所知,异常必须具有与它们引发的函数相同的返回类型,我该怎么做才能返回空列表并打印错误消息?
\n我一直在尝试计算整数3元组列表中的元素,它等于使用SML的给定整数,但它不起作用.任何人都可以帮我弄清楚下面的代码有什么问题或者为我理顺吗?
fun number_in_month(x : int*int*int list, m: int) =
if null x then 0
else
let fun inc x = x + 1;
in
val counter = 0;
if m = #2 (hd x) andalso m > 0 then inc counter
number_in_month((tl x), m)
` else
number_in_month((tl x), m)
end
Run Code Online (Sandbox Code Playgroud)
该函数应该返回m等于列表中每个元组的第二个元素的次数.
如何在签名中声明一个不带参数的函数?
我只看到带有这样的参数的函数签名:leq:item*item->bool
我希望为这样的函数创建一个签名:
initBTree = E (* where empty is of type tree *)
Run Code Online (Sandbox Code Playgroud)
这不起作用: val initBTree:->tree
我正在尝试重新解压缩,这是我到目前为止所遇到的,然后才遇到障碍.
fun myUnZip [] = []
| myUnZip ((x1,x2)::tail) = (* x1 :: myUnZip tail and also do x2 :: tail *)
Run Code Online (Sandbox Code Playgroud)
现在,我知道第二行是不可能的,所以这就是为什么我把评论放在那里以显示我打算做什么.
有关我如何正确做到这一点的任何帮助?
这是我用这种语言的第二天,我只是想学习模式匹配.我目前正在阅读Elementary Standard ML这本书,它有点涵盖了从列表中解压缩元组的主题.虽然这本书为我提供了一个解决方案,但我有点不知所措,并希望其他人可能有不同的解决方案,或者可能对该书的解压缩解决方案提供一些评论.
SML 中的编译时和运行时有什么区别?
写完一些 SML 代码后,我们按下 Enter 键。但我不明白,我们实际上是编译它还是运行它?例如
- fun len [] = 0 | len (x::xs) = 1 + len xs; /* hit enter*/
val len = fn : 'a list -> int
Run Code Online (Sandbox Code Playgroud)
按回车键后,我们得到val len = fn : 'a list -> int结果。这是运行时结果还是编译时结果?
我真的不明白幕后发生了什么。
我有这个SML代码.我不知道为什么我不能编译这个:
fun score =
let
val sum = 3; (* error at this line : SYNTAX ERROR : inserting LPAREN *)
if sum div 2 > 0
then sum = 0
else sum = 1
(*some other code*)
in
sum (* I want to return sum after some steps of calculation *)
end
Run Code Online (Sandbox Code Playgroud)