SML函数不接受真实列表进行比较

时间:2018-12-07 06:42:05

标签: sml

此功能是功能串(针对课程)的一部分。应该获取一个实数列表[s,a,w,h],并将其与其他实数列表进行相等性检查。这些实数列表是通过使用racer_stats()将类型Racer对象(在列表R :: acer中)转换为实数列表制成的。

然后,我希望函数返回具有等于racer_stats()统计信息的统计信息的Racer。不幸的是,无论我尝试什么,我都无法弄清楚如何使SML成为模式匹配[s,a,w,h]的真实列表,因此即使我做了一个新的基本案例,它也不会比较。

有什么建议吗?

fun RFS([s,a,w,h], []) = None
  | RFS([s,a,w,h], R::acer) =
      if ( [s,a,w,h] = racer_stats(R) )
      then R
      else RFS([s,a,w,h], acer);

我也尝试过:

fun RFS( [0.1, 0.2, 0.3] , []) = None 
  | RFS([s,a,w,h], []) = None
  | RFS([s,a,w,h], R::acer) =
      if ( [s,a,w,h] = racer_stats(R) )
      then R
      else RFS([s,a,w,h], acer);

并出现语法错误。

1 个答案:

答案 0 :(得分:1)

以防万一以后有人遇到这个问题。正如molbdnilo指出的那样,实数不是相等类型。要解决此问题,我构建了以下比较运算符:

fun compy([], []) = true
    | compy([], x) = false
    | compy(x, []) = false
    | compy(x::xx, y::yy) = ( floor(x*100.0) = floor(y*100.0) ) andalso compy(xx, yy);

* 100.0是因为我想比较2个小数位以内。然后我将compy换成=

fun RFS([s,a,w,h], []) = None
    | RFS([s,a,w,h], R::acer) = if (compy([s,a,w,h], racer_stats(R)) ) then R
                else  RFS([s,a,w,h], acer);

感谢molbdnilo指出实数不是相等类型!