标签: sml

如何将负整数转换为SML中的字符串,使用减号而不是波浪号?

标准SML库函数Int.toString前缀为负数~而不是-.是否有一个库函数可供使用-,缺少写作

fun i2s i =
    if i < 0 then "-" ^ Int.toString (~i) else Int.toString i
Run Code Online (Sandbox Code Playgroud)

sml smlnj

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

为什么SML和OCaml被认为是ML的方言?ML的定义是什么?

ML有很多方言,而SML和OCaml是最受欢迎的方言.SML和OCaml之间存在许多差异,但它们都被视为ML的方言.所以,

  1. 为什么SML和OCaml被认为是ML的方言?
  2. 如何将语言视为ML的方言?
  3. 如果ML不是SML/OCaml,ML的定义是什么?

我猜ML是SML和OCaml的交集,但我找不到一些详细的定义.

ocaml programming-languages sml

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

标准ML是否支持Unicode?

标准ML是否支持Unicode?

我相信它没有,但找不到任何SML说明这样的权威文档.

是或否是所有需要,但你必须知道一个事实.没有猜测或我相信答案.权威链接会更好.

sml polyml

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

如何在SML中的case语句中打印?

我刚刚开始使用SML,我正在尝试修改一些代码,以便我理解它正在做什么(我找不到一个像样的SML/NJ调试器,但这是一个单独的问题).

fun type_check e theta env non_gens = 
  case e of
   constant_int _ => (integer,theta) 
  | 
   constant_bool _ => (boolean,theta) 
  | ...
Run Code Online (Sandbox Code Playgroud)

假设这是有效的代码,因为constant_int是已经声明的数据类型的一部分,等等.如何添加一个print语句来说"返回"整数"'到案例中?我试过了:

...
constant_int _ => (print "returning integer") (integer,theta)
...
Run Code Online (Sandbox Code Playgroud)

但我得到:

    stdIn:167.22-167.65 Error: operator is not a function [tycon mismatch]
      operator: unit
      in expression:
        (print "returning integer") (integer,theta)

我想我只是不理解如何执行一系列语句,只有最后一个语句应该被视为返回值.有什么建议?

另外,我如何打印自己的数据类型值?当我尝试将数据类型值传递给print()时,SML不喜欢所以我可能必须为每种数据类型创建一个新的打印函数,这是正确的吗?

sml smlnj

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

SML警告:使用空列表或NONE选项时,键入Vars Not Generalized

我不能为我的生活弄清楚为什么以下SML功能在我的作业问题中抛出警告:

fun my_func f ls  = 
  case ls of 
  [] => raise MyException
  | head :: rest => case f head of 
                    SOME v => v
                    | NONE => my_func f rest

fun f a = if isSome a then a else NONE;
Run Code Online (Sandbox Code Playgroud)

每当我使用以下测试函数调用my_func时:

my_func f [NONE, NONE];
my_func f [];
Run Code Online (Sandbox Code Playgroud)

我总是收到警告:

警告:由于值限制而未通用的类型变量被实例化为虚拟类型(X1,X2,...)

每当我传入包含至少一个SOME值的选项列表时,都不会抛出此警告.我知道它必须与我在函数currying中使用多态的事实有关,但我已经完全陷入了如何摆脱这些警告.

如果您有任何想法请帮助 - 提前谢谢!

sml smlnj

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

SML模块系统与Haskell的Type和Typeclass系统之间的能力有何不同?

我试图了解缺点在哪里.SML模块系统是否仅提供依赖类型,类似于Idris如何扩展Haskell类型系统,还是继续进行,而不仅仅是依赖类型的附加功能?有关现有互联网文章中SML模块系统的信息要么难以找到,要么难以理解.

**编辑**我对这个问题的看法有些困惑,混淆似乎源于我对ML模块系统的困惑(我认为是因为我理解了Haskell方式的Functors) ).提供依赖类型作为两种类型系统之间可能存在差异的一个例子,但事实证明它是一个不好的例子,因为两个系统都不支持这样的事情(至少不是直接).

这个问题的主要目标是让我确定ML和Haskell类型系统之间概念表达的差异.哪些抽象/概念不能用另一个抽象/概念表示?为什么有人会声称ML的类型系统比Haskell更现代/更强大,反之亦然.想到这一点的另一种方法是一种类型系统缺少哪一种不存在?

我有兴趣了解这一点的原因是我对构建软件系统感兴趣以及不同类型系统如何使软件的模块化和可扩展性变得更容易或更困难.我对命令式语言中的面向对象类型系统一直不感兴趣,因此我现在正在研究和研究ML和Haskell提供的那些系统,因为它们是我感兴趣的第一个.

haskell type-systems module sml

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

模式匹配lambda的绑定?

在Haskell中,我经常做这样的事情:

f $ \x -> case x of
            A a1 a2 -> ...
            B b1 b2 -> ...
            C c1 c2 -> ...
Run Code Online (Sandbox Code Playgroud)

但我不想要x,我只想解构它.

在标准ML中,我可以这样做:

f (fn A(a1,a2) => ...
    | B(b1,b2) => ...
    | C(c1,c2) => ...)
Run Code Online (Sandbox Code Playgroud)

有没有办法在Haskell或任何GHC扩展中执行此操作?

haskell sml pattern-matching

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

OCaml'下划线类型'(例如'_a)是否会引入运行时类型错误/健全性违规的可能性?

我正在阅读有关标准ML中的值限制的一些内容,并尝试将示例转换为OCaml以查看它将执行的操作.似乎OCaml在上下文中产生这些类型,其中SML由于值限制而拒绝程序.我也在其他上下文中看到过它们,比如空哈希表尚未"特化"到特定类型.

http://mlton.org/ValueRestriction

以下是SML中被拒绝程序的示例:

val r: 'a option ref = ref NONE
val r1: string option ref = r
val r2: int option ref = r
val () = r1 := SOME "foo"
val v: int = valOf (!r2)
Run Code Online (Sandbox Code Playgroud)

如果您逐字输入新泽西州的SML的第一行,则会收到以下错误:

- val r: 'a option ref = ref NONE;
stdIn:1.6-1.33 Error: explicit type variable cannot be generalized at its binding declaration: 'a
Run Code Online (Sandbox Code Playgroud)

如果您不使用显式类型注释

- val r = ref NONE

stdIn:1.6-1.18 Warning: type vars not generalized because of
   value restriction are instantiated …
Run Code Online (Sandbox Code Playgroud)

ocaml sml

11
推荐指数
3
解决办法
810
查看次数

在标准ML中抑制"val it"输出

我正在标准ML(SML/NJ)中编写一个"脚本",根据自己的喜好设置交互式环境.脚本做的最后一件事是打印出一条消息,表明一切顺利.基本上,最后一行是这样的:

print "SML is ready.\n";
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,一切顺利,但SML解释器显示print函数的返回值.

SML is ready.
val it = () : unit
-
Run Code Online (Sandbox Code Playgroud)

由于我只是在屏幕上打印一些东西,我怎么能抑制"val it =():unit"输出,这样我所看到的就是"SML就绪"消息,然后是解释器提示符?

sml smlnj

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

标准ML仿函数示例

标准ML中的函数与模块系统相关,并且可以基于其他结构生成结构.下面给出了为各种类型的列表生成列表组合器的仿函数的示例,但是此示例存在一个问题:

各种类型的列表都具有优势 - 例如,惰性列表可以无限长,并且concantenation列表具有O(1)concat运算符.但是当所有这些列表类型符合相同的签名时,仿函数只能使用它们的常规属性.

因此,我的问题是:什么是一个很好的例子,当函子有用时,各种生成的结构不会失去它们的特殊能力?

signature MYLIST =
sig
  type 'a t
  val null : 'a t -> bool
  val empty : 'a t
  val cons : 'a * 'a t -> 'a t
  val hd : 'a t -> 'a
  val tl : 'a t -> 'a t
end

structure RegularList : MYLIST =
struct
  type 'a t = 'a list
  val null = List.null
  val empty = []
  val cons = op::
  val hd = List.hd
  val tl …
Run Code Online (Sandbox Code Playgroud)

functional-programming ml sml functor

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