2013-01-22 37 views
3

我想创建一个简单的函数,它需要两个格式为int * int * int的日期,如果第一个比第二个旧,则返回。EQUALOP错误消息与SML

fun is_older (date1: (int*int*int), date2: (int*int*int)) = 
    val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1; 
    val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1; 

    if in_days1 < in_days2 
    then true 
    else false 

我得到这个错误:

hwk_1.sml:1.53 Error: syntax error: inserting EQUALOP

uncaught exception Compile [Compile: "syntax error"]

raised at: ../compiler/Parse/main/smlfile.sml:15.24-15.46

../compiler/TopLevel/interact/evalloop.sml:44.55

../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

谁能帮助吗?

+2

你可以用条件'in_days1

回答

6

除了已经提到的内容之外,你还应该使用模式匹配来分解这个三元组。这样做,你也可以扔掉类型注释,因为现在已经清楚这是一个三元组(对于读者而言,但更重要的是也是类型系统)。

fun is_older ((y1, m1, d1), (y2, m2, d2)) = 
    let 
     val days1 = y1 * 365 + m1 * 30 + d1 
     val days2 = y2 * 365 + m2 * 30 + d2 
    in 
     days1 < days2 
    end 

然而,你可以做到这一点更聪明。如果你有多个函数处理日期,你可以创建一个漂亮的小帮助函数toDays。在下面的例子我刚才包括isOlder功能里面,但你可以把它放在顶层或内部local -declaration如果你wan't隐藏它拿走

fun isOlder (date1, date2) = 
    let 
     fun toDays (y, m, d) = y * 365 + m * 30 + d 
    in 
     toDays date1 < toDays date2 
    end 
+1

“这样做,你可以扔掉那个类型的注释。”类型注释是可选的方式。或者,您是否从可读性的角度来看是指(即现在读者已经清楚,即使没有注释,参数也是元组)? – sepp2k

+1

嗯,我正在做[这门课程](https://class.coursera.org/proglang-2012-001/class/index),我认为模式匹配将是下周的主题。但感谢您的帮助! –

+0

@ sepp2k,最后一部分。我会更新文本以更清楚地反映这一点。希望到现在为止,我应该给人留下这样的印象:我现在只是SML的一小部分;) –

5
val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1; 
val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1; 

本地val定义需要letin之间。

+0

哦,谢谢!我不知道是这样的... –

0

FWIW,我得到了同样的错误就在这同一作业的其他练习一个:

Error: syntax error: inserting EQUALOP

但对我来说,这是发生在第一线。这让我感到困惑,因为我来自Python,那里的错误通常发生在之后的错误之处。

底线,我想知道的是这个:这个错误意味着它不能编译代码。

P.S.如果您使用letin,则还必须使用end。 (您不需要使用vallet来解决is_older问题 - 有一种方法可以单独使用设置逻辑来完成)。