【问题标题】:SML function not accepting real list for comparisonSML 函数不接受真实列表进行比较
【发布时间】:2019-05-08 22:10:50
【问题描述】:

此函数是函数字符串的一部分(用于课程)。它应该获取一个实数列表 [s,a,w,h],并根据其他实数列表检查它是否相等。这些实数列表是通过使用 racer_stats() 将类型赛车对象(在列表 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);

并出现语法错误。

【问题讨论】:

  • real 不是等式类型(尝试在解释器中输入1.0 = 1.0;),所以real list 也不是,并且在实数上匹配是语法错误。你需要想出不同的比较方法。

标签: sml


【解决方案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 指出实数不是等式类型!

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2018-03-14
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多