1

我正在做一个给出两个时间戳的练习,我必须找出哪个大。这个程序是用 SML 编写的。所以我想出了这个程序...

val record1 = {hour = 11, min = 45, f = "PM"};    
val record2 = {hour = 2,min = 13,f = "AM"};    
fun timerrecord(record1,record2)=     
if (#f record1 = "PM") andalso (#f record2="AM") then "t1 comes First"    
else if(#f record1 = "AM") andalso (#f record1="PM") then "t2 comes First"     
else if (#hour record1 > #hour record1) then "t1 comes First"    
else if (#hour record1 < #hour record1) then "t2 comes First"    
else if (#min record1 > #min record1) then "t1 comes First"    
else "t2 comes First";

问题是当我在没有函数的情况下编写它时,它给出了正确的结果,但是当我将代码放入该函数(如上所示)时,它给出了一个错误......未解决的 FLEX RECORD。

t1,t2 和 record1,record2 是时间戳。

我是 SML 的新手,所以任何帮助都会有所帮助。提前致谢。

4

2 回答 2

3

正如 user987339 所说,您可以放入类型注释来解析类型。但是在 ML 中执行此操作的常用方法不是一开始就使用记录选择器#label,而是依赖模式匹配,这意味着类型:

fun timerRecord({hour = h1, min = m1, f = f1}, {hour = h2, min = m2, f = f2}) =     
    if f1 = "PM" andalso f2 = "AM" then "t1 comes first"    
    else if f1 = "AM" andalso f2 = "PM" then "t2 comes first"     
    else if h1 > h2 then "t2 comes first"    
    else if h1 < h2 then "t1 comes first"    
    else if m1 > m2 then "t2 comes first"    
    else "t1 comes first"

(修复了几个案例。)

于 2013-11-10T09:10:47.517 回答
1

您必须定义记录类型才能编译此函数。所以添加:

type recc = {hour:int, min:int, f:string};    

并将您的函数签名更改为:

fun timerrecord(record1:recc,record2:recc)=

或者您可以通过将函数签名更改为:

fun timerrecord(record1:{hour:int, min:int, f:string},record2:{hour:int, min:int, f:string})= 

取决于你有多干:-)

PS:找出 DRY 的含义。

于 2013-11-09T14:28:34.617 回答