检查对列表是否未排序

时间:2013-03-21 17:10:22

标签: list sml

我遇到以下代码的问题:

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)

但是我的错误列在哪一对?

1 个答案:

答案 0 :(得分:1)

问题在于您致电cmp。以下是unsorted的工作版本的推断类型:('a * 'a -> order) -> 'a list -> bool

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

在您的其他版本中,您希望处理对列表(即'a * 'a list类型的值),因此您使用的是不同的模式:((x,y)::xx::xs)。在这种情况下,xy都绑定到'a类型的值,但xx绑定到一对类型'a * 'a。因此,在您致电cmp时,这是参数的类型:'a * ('a * 'a)。请记住,在ML中,所有函数都使用单个参数,并且通过传递元组或currying来实现多个参数,这两个参数都是在此示例中使用的。 (cmp采用元组,unsorted为咖喱)

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

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

...看看你在尝试完成这个功能时会走多远。