小编Jes*_*erg的帖子

增加SML/NJ中的打印深度

我试图让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 smlnj

17
推荐指数
1
解决办法
4862
查看次数

通过索引变量访问SML元组

问题很简单.

如何在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)

我希望,有人可以帮忙.提前致谢!

tuples sml

7
推荐指数
2
解决办法
7816
查看次数

SML:为什么函数总是采用单参数使语言变得灵活

我(从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不能?

function sml

4
推荐指数
1
解决办法
1191
查看次数

为什么我在此代码的输出中有意外的'#'?

我正在尝试创建一个派生函数来区分使用数据类型,如下所示:

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 smlnj

3
推荐指数
1
解决办法
89
查看次数

在SML中迭代多个列表

我有在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)

sml

2
推荐指数
1
解决办法
2649
查看次数

如何引发打印消息并返回值的异常?

我们的教授要求我们在作业中这样做:

\n\n
\n

如果给定的阈值为负,则应打印消息 \xe2\x80\x9cError: Negative Threshold\xe2\x80\x9d 并返回空列表。为此,需要 de\xef\xac\x81ne 一个名为 ThresholdOutOfRange 的异常,如果阈值为负则引发该异常,并处理该异常以实现正确的行为。

\n
\n\n

我不明白如何引发异常、返回值和打印错误消息。现在我引发异常的代码是(只是有异常的重要部分):

\n\n
fun 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,当引发异常时,我的代码将仅返回一个空列表。鉴于据我所知,异常必须具有与它们引发的函数相同的返回类型,我该怎么做才能返回空列表并打印错误消息?

\n

exception sml

2
推荐指数
1
解决办法
2829
查看次数

计算列表中的元素

我一直在尝试计算整数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等于列表中每个元组的第二个元素的次数.

list sml

1
推荐指数
1
解决办法
3837
查看次数

没有参数的函数声明

如何在签名中声明一个不带参数的函数?

我只看到带有这样的参数的函数签名:leq:item*item->bool 我希望为这样的函数创建一个签名:

initBTree = E   (* where empty is of type tree *)
Run Code Online (Sandbox Code Playgroud)

这不起作用: val initBTree:->tree

sml

1
推荐指数
1
解决办法
1642
查看次数

如何重新创建解压缩

我正在尝试重新解压缩,这是我到目前为止所遇到的,然后才遇到障碍.

fun myUnZip [] = []
  | myUnZip ((x1,x2)::tail) = (* x1 :: myUnZip tail and also do x2 :: tail *)
Run Code Online (Sandbox Code Playgroud)

现在,我知道第二行是不可能的,所以这就是为什么我把评论放在那里以显示我打算做什么.
有关我如何正确做到这一点的任何帮助?

这是我用这种语言的第二天,我只是想学习模式匹配.我目前正在阅读Elementary Standard ML这本书,它有点涵盖了从列表中解压缩元组的主题.虽然这本书为我提供了一个解决方案,但我有点不知所措,并希望其他人可能有不同的解决方案,或者可能对该书的解压缩解决方案提供一些评论.

sml

1
推荐指数
1
解决办法
987
查看次数

编译时和运行时的区别

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 read-eval-print-loop

1
推荐指数
1
解决办法
1495
查看次数

let-in表达式中的错误代码

我有这个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)

sml

0
推荐指数
1
解决办法
218
查看次数

标签 统计

sml ×11

smlnj ×2

exception ×1

function ×1

list ×1

read-eval-print-loop ×1

tuples ×1