标准ML多态分类

时间:2016-02-29 00:21:59

标签: 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)
                                   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 

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您通过"作弊"找出sort的类型使下一步更难;不要走捷径 (没有人通过偷看答案来学习任何东西。)

但是在这里你可以找出insert

你知道

val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list 

sort的第二个参数是'a list

insert(a, sort(less, l))

您可以立即看到某些 (X * Y) -> ZXY的某些类型Z

您将sort的第二个参数 - a - 的第一个元素作为insert的第一个参数传递。
由于sort的第二个参数是'a list,因此该列表的第一个元素是'a。 因此X'a,我们现在知道insert某些 ('a * Y) -> ZY Z

insert的第二个参数 - sort(less, l)的类型是众所周知的;它是'a list 我们现在知道Y'a listinsert('a * 'a list) -> Z 某些 Z

剩下的就是返回类型,因为

insert(a, sort(less, l))

sort返回的内容,它必须与sort具有相同的返回类型 因此Z'a list

总之,insert的类型是

('a * 'a list) -> 'a list