0

我对以下代码有疑问:

fun unsorted cmp ((x, y)::[]) = false
  | unsorted cmp ((x, y)::xx::xs) =
    if cmp(y, xx) = GREATER then true else unsorted cmp (xx::xs)

我只希望这个函数true在列表未排序时返回,false否则返回。这应该适用于由第二个组件比较的对列表。

这是我的简单列表的正确代码:

fun unsorted' cmp [] = false
  | unsorted' cmp (x::[]) = false
  | unsorted' cmp (x::xx::xs) =
    if cmp(x, xx) = GREATER then true else unsorted' cmp (xx::xs)

但是我对列表的错误在哪里?

4

1 回答 1

1

问题出在您对cmp. 这是您的工作版本的推断类型unsorted('a * 'a -> order) -> 'a list -> bool

它需要一个比较函数(类型为'a * 'a -> order)和一个包含类型为 的元素的列表'a。然后,您使用以下模式对列表进行模式匹配:(x::xx::xs)因此xxx都绑定到 type 的值'a,并且xs绑定到 的列表'a。然后你cmp用一个 2 元组调用,它的类型为'a * 'a: cmp(x,xx)

在您的另一个版本中,您想要处理一对列表(即 type 的值'a * 'a list),因此您使用的是不同的模式:((x,y)::xx::xs). 在这种情况下,xandy都绑定到 type 的值,'axx绑定到一对 type 'a * 'a。因此,在您对 的调用中cmp,这是参数的类型:'a * ('a * 'a)。请记住,在 ML 中,所有函数都接受一个参数,而多个参数是通过传递元组或柯里化来实现的,您在本示例中都使用了这两种方法。(cmp接受一个元组,并被unsorted咖喱)

尝试在新版本中使用以下模式:

fun unsorted cmp ((x,y)::[]) = ...
  | unsorted cmp ((x,y)::(xx,yy)::xs) = ...

...看看你在尝试完成该功能时能走多远。

于 2013-03-21T17:29:21.623 回答