此功能是功能串(针对课程)的一部分。应该获取一个实数列表[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);
并出现语法错误。
答案 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指出实数不是相等类型!