使用SML快速排序错误

时间:2017-03-26 15:27:15

标签: sorting sml

我上周学会了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给了我一些帮助:(

1 个答案:

答案 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