【发布时间】:2016-06-11 22:24:06
【问题描述】:
我在 ML 方面非常缺乏经验,我无法理解这一点。
开始提问
多态排序
这个对列表执行插入排序的函数将比较函数less和要排序的元素列表l作为参数。代码编译运行正常:
fun sort(less, nil) = nil |
sort(less, a : : l) =
let
fun insert(a, nil) = a : : nil |
insert(a, b : : l) = if less(a,b) then a : : (b: : l)
else b : : insert(a, l)
in
insert(a, sort(less, l))
end;
这个排序函数的类型是什么?简单解释一下,包括辅助功能插入的类型。您不必在此代码上运行 ML 算法;只需解释为什么普通的 ML 程序员会期望代码具有这种类型。 (问题结束)
我已经获得了排序函数的类型(通过在 SML 解释器中运行代码),但我无法获得关于插入的第二部分。
排序函数类型:
val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list
任何帮助将不胜感激。
【问题讨论】:
-
如果您在 SML REPL 中发现了
sort的类型,为什么不对insert做同样的事情?无论如何——这看起来像是家庭作业。如果是这样,课程的文本应该对 SML 的类型系统进行相当详细的讨论。你读过它吗?您复制了一个问题,但没有提出您自己的任何问题,至少没有提出您付出任何努力的问题。 -
看过了,没看懂(这也是我来这里的原因)。另外,我确实将插入函数放入编译器中,我得到了这个
fun insert(a, nil) = a :: nil | insert(a, b :: l) = if less(a,b) then a :: (b :: l) else b :: insert(a,l) -
我输入了
fun insert部分,上面写着stdIn:9.24-9.28 Error: unbound variable or constructor: less -
但是编译器中函数
insert的类型是什么?还有——究竟是什么,你不明白你一直在读什么?例如哪些部分fn : ('a * 'a -> bool) * 'a list -> 'a list给你添麻烦了? -
为什么不先提供
less的定义?
标签: sorting polymorphism sml