【问题标题】:Standard ML polymorphic sorting标准 ML 多态排序
【发布时间】: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


【解决方案1】:

你通过“作弊”弄清了sort的类型,让下一步更难了;不要走捷径。
(没有人通过偷看答案学到任何东西。)

但你可以通过以下方式找出insert

你知道的

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

sort 的第二个参数是'a list

insert(a, sort(less, l))

您可以立即看到它有一些类型 (X * Y) -> Z 用于 一些 XYZ

您将sort 的第二个参数-a 的第一个元素作为insert 的第一个参数传递。
由于sort 的第二个参数是'a list,因此该列表的第一个元素是'a
所以X'a,我们现在知道insert 对于一些 YZ('a * 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 

【讨论】:

  • 我不一定会说看 ML 推断出什么类型是“作弊”,因为重点似乎是解释类型的含义。对于初学者来说,甚至很难解析像('a * 'a -> bool) * 'a list -> 'a list 这样的东西,更不用说对其含义做出有力的解释了。
猜你喜欢
  • 2011-05-05
  • 2012-03-22
  • 2017-06-25
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多