Sorting 标准ML多态排序
我在ML方面非常缺乏经验,我就是不能理解这一点 开始问题 多态排序 此函数对列表执行插入排序时,将比较函数less和待排序元素的列表l作为参数。代码正确编译并运行:Sorting 标准ML多态排序,sorting,polymorphism,sml,Sorting,Polymorphism,Sml,我在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)
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;
此排序函数的类型是什么?简要说明,包括附属函数insert的类型。您不必在此代码上运行ML算法;请解释一下为什么普通的ML程序员会期望代码具有这种类型。(问题结束)
我已经得到了排序函数的类型(通过在SML解释器中运行代码),但我无法得到关于insert的第二部分
排序函数的类型:
val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list
任何帮助都将不胜感激。你通过“作弊”找出了
排序的类型使得下一步更加困难;不要走捷径。
(没有人从偷看答案中学到任何东西。)
但以下是您如何理解insert
:
你知道吗
val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list
排序
的第二个参数是一个'a列表
在
您可以立即看到,对于某些X
、Y
和Z
,它有一些类型(X*Y)->Z
您正在将sort
的第二个参数-a
-的第一个元素作为insert
的第一个参数传递。
由于sort
的第二个参数是'a列表
,因此该列表的第一个元素是'a
所以X
是'a
,我们现在知道insert
是('a*Y)->Z
对于一些Y
和Z
insert
的第二个参数--sort(less,l)
的类型是众所周知的;这是一个列表
所以我们现在知道
Y
是'一个列表
,insert
是('a*'一个列表)->Z
,对于一些Z
剩下的就是返回类型,以及
insert(a, sort(less, l))
是sort
返回的内容,它必须具有与sort
相同的返回类型所以
Z
是一个列表
总之,insert
的类型是
('a * 'a list) -> 'a list
如果您在SML REPL中发现了
排序的类型,为什么不对插入?无论如何,这看起来像是家庭作业。如果是这样,本课程的课文应该对SML的类型系统进行相当详细的讨论。你读了吗?你复制了一个问题,但没有问自己任何问题,至少没有一个问题表明你的努力。我读过,但我不明白(这就是我来这里的原因)。另外,我将insert函数放入编译器,得到了一个有趣的insert(a,nil)=a::nil | insert(a,b::l)=如果小于(a,b),那么a:(b::l)否则b::insert(a,l)
我输入了fun insert
部分,它说stdIn:9.24-9.28错误:未绑定变量或构造函数:less
,但是编译器的函数insert
的类型是什么?还有,你到底不明白你一直在读什么?例如,fn:('a*'a->bool)*'a list->'a list
的哪些部分给了你一个问题?为什么不先提供less
的定义呢?我不一定认为ML推断出什么类型是“欺骗”,因为重点似乎是解释类型的含义。对于初学者来说,甚至很难解析像('a*'a->bool)*'a list->'a list
这样的东西,更不用说对它的含义给出令人信服的解释了。
('a * 'a list) -> 'a list