我遇到以下代码的问题:
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)
但是我的错误列在哪一对?
答案 0 :(得分:1)
问题在于您致电cmp
。以下是unsorted
的工作版本的推断类型:('a * 'a -> order) -> 'a list -> bool
它需要一个比较函数(类型为'a * 'a -> order
)和一个包含类型为'a
的元素的列表。然后使用以下模式对列表进行模式匹配:(x::xx::xs)
因此x
和xx
都绑定到'a
类型的值,并且xs
绑定到'a
列表。然后,您使用2元组调用cmp
,其类型为'a * 'a
:cmp(x,xx)
。
在您的其他版本中,您希望处理对列表(即'a * 'a list
类型的值),因此您使用的是不同的模式:((x,y)::xx::xs)
。在这种情况下,x
和y
都绑定到'a
类型的值,但xx
绑定到一对类型'a * 'a
。因此,在您致电cmp
时,这是参数的类型:'a * ('a * 'a)
。请记住,在ML中,所有函数都使用单个参数,并且通过传递元组或currying来实现多个参数,这两个参数都是在此示例中使用的。 (cmp
采用元组,unsorted
为咖喱)
尝试在新版本中使用以下模式:
fun unsorted cmp ((x,y)::[]) = ...
| unsorted cmp ((x,y)::(xx,yy)::xs) = ...
...看看你在尝试完成这个功能时会走多远。