我上周学会了SML,所以我尝试使用Quicksort代码来理解它。 我的代码是:
fun quicksort(l: int list) =
if length l < 2
then l
else let fun split(l:int list, v: int) =
if null l
then ([], [])
else if v > hd l
then ((hd l)::(#1 split(tl l, v)), #2 split(tl l, v))
else (#1 split(tl l, v), (hd l)::(#2 split(tl l, v)))
in
(#1 split(quicksort(tl l), hd l)) @ ((hd l)::(#2 split(quicksort(tl l), hd l)))
end
这是错误消息:
Standard ML of New Jersey v110.75 [built: Sat Sep 29 12:51:13 2012]
- stdIn:21.18-21.35 Error: operator and operand don't agree [type mismatch]
operator domain: {1:'Y; 'Z}
operand: int list * int -> 'X
in expression:
(fn {1=1,...} => 1) split
stdIn:21.8-21.56 Error: operator and operand don't agree [type mismatch]
operator domain: {2:'Y; 'Z}
operand: int list * int -> 'X
in expression:
(fn {2=2,...} => 2) split
stdIn:22.8-22.56 Error: operator and operand don't agree [type mismatch]
operator domain: {1:'Y; 'Z}
operand: int list * int -> 'X
in expression:
(fn {1=1,...} => 1) split
stdIn:22.37-22.54 Error: operator and operand don't agree [type mismatch]
operator domain: {2:'Y; 'Z}
operand: int list * int -> 'X
in expression:
(fn {2=2,...} => 2) split
stdIn:24.4-24.35 Error: operator and operand don't agree [type mismatch]
operator domain: {1:'Y; 'Z}
operand: int list * int -> int list * _ list
in expression:
(fn {1=1,...} => 1) split
stdIn:24.49-24.80 Error: operator and operand don't agree [type mismatch]
operator domain: {2:'Y; 'Z}
operand: int list * int -> int list * _ list
in expression:
(fn {2=2,...} => 2) split
-
我将给定列表的头部设置为pivot,并将列表拆分为int列表对并再次合并。
我认为没有类型匹配问题,但我不知道为什么它不起作用。 Plz给了我一些帮助:(
答案 0 :(得分:1)
在Moscow ML中运行代码以突出显示问题代码:
! Toplevel input:
! then ((hd l)::(#1 split(tl l, v)), #2 split(tl l, v))
! ^^^^^
! Type clash: expression of type
! int list * int -> int list * 'a list
! cannot have type
! {1 : 'b, ...}
此类型错误表明类型 int list×int - &gt;的表达式int list×'a list 用于代码的另一部分期望它是 {1:'b,...} 类型的地方。第一种类型是函数,最后一种类型是包含至少一个条目的记录。
问题是#1 split(tl l, v)
被解释为(#1 split)(tl l, v)
而不是您想要的#1 (split (tl l, v))
。也就是说,您需要函数的结果的第一个记录条目,而不是函数本身;这是荒谬的..虽然#1
实际上是一个宏而不是一个函数,但它在语法上的行为就像一个函数,应该这样组成。
由于您在SML中执行QuickSort,您可能会在问题True QuickSort in Standard ML中被包含在内,其中包含1)RosettaCode使用模式匹配的版本,而不是像hd
和{{1}这些可怕的部分函数这将在运行时意外崩溃您的程序,2)John Coleman的QuickSort版本,实际上是算法上的QuickSort。 :-P