标准SML库函数Int.toString前缀为负数~而不是-.是否有一个库函数可供使用-,缺少写作
fun i2s i =
if i < 0 then "-" ^ Int.toString (~i) else Int.toString i
Run Code Online (Sandbox Code Playgroud) ML有很多方言,而SML和OCaml是最受欢迎的方言.SML和OCaml之间存在许多差异,但它们都被视为ML的方言.所以,
我猜ML是SML和OCaml的交集,但我找不到一些详细的定义.
标准ML是否支持Unicode?
我相信它没有,但找不到任何SML说明这样的权威文档.
是或否是所有需要,但你必须知道一个事实.没有猜测或我相信答案.权威链接会更好.
我刚刚开始使用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功能在我的作业问题中抛出警告:
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模块系统是否仅提供依赖类型,类似于Idris如何扩展Haskell类型系统,还是继续进行,而不仅仅是依赖类型的附加功能?有关现有互联网文章中SML模块系统的信息要么难以找到,要么难以理解.
**编辑**我对这个问题的看法有些困惑,混淆似乎源于我对ML模块系统的困惑(我认为是因为我理解了Haskell方式的Functors) ).提供依赖类型作为两种类型系统之间可能存在差异的一个例子,但事实证明它是一个不好的例子,因为两个系统都不支持这样的事情(至少不是直接).
这个问题的主要目标是让我确定ML和Haskell类型系统之间概念表达的差异.哪些抽象/概念不能用另一个抽象/概念表示?为什么有人会声称ML的类型系统比Haskell更现代/更强大,反之亦然.想到这一点的另一种方法是一种类型系统缺少哪一种不存在?
我有兴趣了解这一点的原因是我对构建软件系统感兴趣以及不同类型系统如何使软件的模块化和可扩展性变得更容易或更困难.我对命令式语言中的面向对象类型系统一直不感兴趣,因此我现在正在研究和研究ML和Haskell提供的那些系统,因为它们是我感兴趣的第一个.
在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扩展中执行此操作?
我正在阅读有关标准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) 我正在标准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就绪"消息,然后是解释器提示符?
标准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)