我对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程序员会期望代码具有这种类型。 (问题结尾)
我已经获得了sort函数的类型(通过在SML解释器中运行代码),但我无法获得关于insert的第二部分。
排序功能类型:
val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list
非常感谢任何帮助。
答案 0 :(得分:3)
您通过"作弊"找出sort
的类型使下一步更难;不要走捷径
(没有人通过偷看答案来学习任何东西。)
但是在这里你可以找出insert
:
你知道
val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list
sort
的第二个参数是'a list
。
在
insert(a, sort(less, l))
您可以立即看到某些 (X * Y) -> Z
,X
和Y
的某些类型Z
。
您将sort
的第二个参数 - a
- 的第一个元素作为insert
的第一个参数传递。
由于sort
的第二个参数是'a list
,因此该列表的第一个元素是'a
。
因此X
为'a
,我们现在知道insert
为某些 ('a * Y) -> Z
和Y
Z
。
insert
的第二个参数 - sort(less, l)
的类型是众所周知的;它是'a list
我们现在知道Y
为'a list
,insert
为('a * 'a list) -> Z
某些 Z
。
剩下的就是返回类型,因为
insert(a, sort(less, l))
是sort
返回的内容,它必须与sort
具有相同的返回类型
因此Z
为'a list
。
总之,insert
的类型是
('a * 'a list) -> 'a list