Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 标准ML多态排序_Sorting_Polymorphism_Sml - Fatal编程技术网

Sorting 标准ML多态排序

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)

我在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;
此排序函数的类型是什么?简要说明,包括附属函数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