SMLNJ插入排序运算符和操作数不一致错误

SMLNJ插入排序运算符和操作数不一致错误,sml,insertion-sort,smlnj,operand,Sml,Insertion Sort,Smlnj,Operand,我正在用SML做一个插入排序代码,在这里 fun compare(x:real, y:real, F) = F(x, y); fun isEqual(x:real, y:real) = ((x <= y) andalso (x >= y)); fun rinsert(x: real, [], F) = [x] |rinsert(x, (y::ys), F) = if isEqual(x, y) then rinsert (x, ys, F) else if

我正在用SML做一个插入排序代码,在这里

fun compare(x:real, y:real, F) = F(x, y);
fun isEqual(x:real, y:real) = ((x <= y) andalso (x >= y));

fun rinsert(x: real, [], F) = [x]
    |rinsert(x, (y::ys), F) =
    if isEqual(x, y) then rinsert (x, ys, F)
    else if compare(x, y, F) then x::y::ys
            else y::(rinsert (x, ys, F));

fun rinsort([], F) = []
    |rinsort(x::xs, F) = rinsert(x, (rinsort(xs, F), F));
有趣的比较(x:real,y:real,F)=F(x,y); 乐趣相等(x:real,y:real)=((x=y)); fun-rinsert(x:real,[],F)=[x] |rinsert(x,(y::ys),F)= 如果相等(x,y),则rinsert(x,ys,F) 否则如果比较(x,y,F),那么x::y::ys else y::(rinsert(x,ys,F)); 有趣的漂流器([],F)=[] |rinsort(x::xs,F)=rinsert(x,(rinsort(xs,F),F)); 然而,在运行它时,我得到了这个错误

val isEqual = fn : real * real -> bool                                                                                                                                                               
val rinsert = fn : real * real list * (real * real -> bool) -> real list                                                                                                                             
stdIn:12.27-12.58 Error: operator and operand don't agree [tycon mismatch]                                                                                                                           
  operator domain: real * real list * (real * real -> bool)                                                                                                                                          
  operand:         'Z * ('Y list * 'X)                                                                                                                                                               
  in expression:                                                                                                                                                                                     
    rinsert (x,(rinsort (<exp>,<exp>),F))
val isEqual=fn:real*real->bool
val-rinsert=fn:real*real list*(real*real->bool)->real list
stdIn:12.27-12.58错误:运算符和操作数不一致[tycon不匹配]
操作员域:实*实列表*(实*实->布尔)
操作数:'Z*('Y list*'X)
在表达上:
rinsert(x,(rinsort(,),F))

我知道rinsort错误地调用了rinsert,但我不确定如何修复它。

如果它有用,这是一个示例,说明您的代码应该如何与
真实列表一起工作。

fun compare(x:real, y:real, F) = F x y;
fun isEqual(x:real, y:real) = ((x <= y) andalso (x >= y));

fun rinsert(x: real, [], F) = [x]
    |rinsert(x, (y::ys), F) =
    if isEqual(x, y) then rinsert (x, ys, F)
    else if compare(x, y, F) then x::y::ys
            else y::(rinsert (x, ys, F));

fun rinsort([], F) = []
    |rinsort(x::xs, F) = rinsert(x, rinsort(xs, F), F);

val funcComp = fn r1 : real => fn r2 : real => if r1 < r2 then true else false;
val l : real list = [1.0, 3.8, 5.6, 3.8, 4.4, 5.6, 6.3, 5.5, 4.6, 8.1];
val b = rinsort(l, funcComp);
fun比较(x:real,y:real,F)=fxy;
乐趣相等(x:real,y:real)=((x=y));
fun-rinsert(x:real,[],F)=[x]
|rinsert(x,(y::ys),F)=
如果相等(x,y),则rinsert(x,ys,F)
否则如果比较(x,y,F),那么x::y::ys
else y::(rinsert(x,ys,F));
有趣的漂流器([],F)=[]
|rinsort(x::xs,F)=rinsert(x,rinsort(xs,F),F);
val funcomp=fn r1:real=>fn r2:real=>如果r1
一些一般性反馈:

  • 函数
    compare
    仅用于切换
    F
    的参数顺序,因此您最好只参考
    F
    本身

  • isEqual的功能有点不好。因为有一个原因,尽量避免这样比较它们。事实证明,为了对real进行排序,您只需要一个列表。这与SML/NJ的内置
    ListMergeSort.sort
    相当。我选择了排序,因为您可能希望通过部分函数应用程序对其进行专门化,例如

    val realsort = sort (op <=) : real list -> real list
    val stringsort = sort (op >) : string list -> string list
    

    另一个属性可能是未排序列表中的每个元素都存在于已排序列表中。如果不假设
    x
    具有相等类型(
    ''a
    ),则后一个属性可能很难测试。但是,您可以在测试中具体执行此操作。

    Risert接受多少个参数?你用多少个参数来调用它?Risert接受三个参数,一个实数、一个列表和一个运算符(比如opI不明白你所说的“它应该只调用三个”是什么意思).看代码。数一数参数。有多少个?哇,这对我来说是一个可怕的疏忽,谢谢伙计。现在工作很好
    如果r1>r2,那么false或者true
    更好地表示为
    r1是,但不准确,因为
    isEqual
    已经检查了它们的相等性。无论如何,你的版本肯定更好理解你不应该像这样来比较Reals。你可能会考虑使用<代码> Real.。= = <代码>或ε检验。
    val realsort = sort (op <=) : real list -> real list
    val stringsort = sort (op >) : string list -> string list
    
    fun sorted_prop _ [] = true
      | sorted_prop _ [_] = true
      | sorted_prop leq (x::y::xs) = leq (x, y) andalso sorted_prop leq (y::xs)