出于好奇,我最近开始学习标准ML.所以我所知道的是有一个高效的编译器(MLton),它允许我们自由地使用抽象而不用担心性能.
如果我可以使用Standard ML进行一些GUI编程,那将是完美的.是否有像Gtk,Qt或WxWidgets绑定标准ML的东西?
非常感谢你.
Is there any way to check/test the type of a variable?
I want to use it like this:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
Run Code Online (Sandbox Code Playgroud) 标准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) 在Isabelle理论文件中,我可以编写简单的单行策略,如下所示:
apply (clarsimp simp: split_def split: prod.splits)
Run Code Online (Sandbox Code Playgroud)
然而,我发现,当我开始编写ML代码来自动化证明,生成一个ML tactic
对象时,这些单行变得相当冗长:
clarsimp_tac (Context.proof_map (
Simplifier.map_ss (fold Splitter.add_split @{thms prod.splits})
#> Simplifier.map_ss (fn ss => ss addsimps [@{thm split_def}]))
@{context}) 1
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来编写Isabelle/ML级别的简单单线战术?
例如,像反引语这样的东西:@{tactic "clarsimp simp: split_def split: prod.splits"}
产生类型的函数context -> tactic
,将是一个理想的解决方案.
我从这里使用DMG for x86下载并安装了SML NJ实现:http: //smlnj.cs.uchicago.edu/dist/working/110.72/index.html
但是,当我打开一个终端窗口并转到/usr/local/smlnj-110.72/bin并运行sml时,我找不到bash命令.我对UNIX不太熟悉,所以我猜我做错了.
谢谢您的帮助!
是否可以在SML中编写递归匿名函数?我知道我可以使用fun
语法,但我很好奇.
我写过,作为我想要的一个例子:
val fact =
fn n => case n of
0 => 1
| x => x * fact (n - 1)
Run Code Online (Sandbox Code Playgroud) 在ML中,可以为匹配模式的每个元素指定名称:
fun findPair n nil = NONE
| findPair n (head as (n1, _))::rest =
if n = n1 then (SOME head) else (findPair n rest)
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我为第一对列表定义了一个别名,并匹配了该对的内容.Scala中是否有等效的构造?
我正在尝试使用SML/NJ,我用它sml < source.sml
来运行代码,但它打印出太多的信息.
例如,这是source.sml
:
fun fac 0 = 1
| fac n = n * fac (n - 1)
val r = fac 10 ;
print(Int.toString(r));
Run Code Online (Sandbox Code Playgroud)
这是输出:
Standard ML of New Jersey v110.77 [built: Tue Mar 10 07:03:24 2015]
- val fac = fn : int -> int
val r = 3628800 : int
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
3628800val it = () : unit
Run Code Online (Sandbox Code Playgroud)
来自标准ML中的抑制"val it"输出,如何禁用SMLNJ警告?,并且SMLNJ想要从每个print语句执行中删除"val it =():unit" …
我找不到一个初学者友好的答案,解决了SML中"local"和"let"关键字之间的区别.有人可以提供一个简单的例子,并解释何时使用另一个?
对于我将要教授的课程,我正在为标准ML寻找快速编译器或字节码解释器. 我正在寻找快速编译时间; 任何合理的运行时间都可以.如果编译模型简单明了,则可获得奖励.课堂上的学生也将使用MLton生成好的二进制文件,但MLton的编译速度很慢,有时学生需要可以与之交互的东西.
这就是我所知道的:
新泽西州的标准ML有一个交互式读取 - 评估 - 打印循环,但它的编译规则有点奇怪,而且有点慢.不过,它可能是领先的竞争者.
莫斯科ML曾经是理想的,但它仍未提供2004年标准基础库.最不幸的是,因为除了它的许多其他优良属性外,莫斯科ML还有一个交互式帮助系统 - 但我不能给我的学生一个编译器,它的库与所有在线文档所说的不同.
Poly/ML可能很适合这个法案,除了在线查看文档,我无法弄清楚如何编译它.那可能没问题.
目前看起来好像SML/NJ或Poly/ML都是最好的折衷方案.自从我在标准ML中做了任何认真的工作已经很多年了,我欢迎有关其他编译器的信息,或者根据您的经验,这些替代方案中哪些是最快的交互和最容易学习使用的.
compiler-construction interpreter functional-programming sml