Sml 从日期列表中获取min元素(运算符不是函数[tycon不匹配])
我想知道,如何在列表中找到最早的日期:Sml 从日期列表中获取min元素(运算符不是函数[tycon不匹配]),sml,ml,Sml,Ml,我想知道,如何在列表中找到最早的日期: fun the_oldest_date(date_list: (int * int * int) list) = let (*it might be useful*) fun older_date(date1: (int * int * int), date2: (int * int * int)) = if #1 date1 < #1 date2 andalso #2 date1 < #2
fun the_oldest_date(date_list: (int * int * int) list) =
let
(*it might be useful*)
fun older_date(date1: (int * int * int), date2: (int * int * int)) =
if #1 date1 < #1 date2 andalso
#2 date1 < #2 date2 andalso
#3 date1 < #3 date2
then date1
else date2
in
if null date_list
then NONE
else SOME older_date(hd date_list, the_oldest_date(tl date_list))
end
sml正在抱怨,因为您正在使用选项类型
'a option=NONE | a的一些
即中的参数(一些较旧的日期).
应该是单个元素,它应该是您最早的日期。确定。首先,删除最后一个,并在较旧的日期中删除,我会将每个日期转换为一个历元,然后比较整数。差不多
epoch = (#1 date-1) * 365 + daysBeforeMonth(#2 date) + (#3 date)
亚历克斯
旧的_date函数无法正常工作。您没有考虑具有相同年份和/或月份的两个日期(即(1,1,1)和(1,1,2))。最后,这个函数应该返回bool
而不是(int*int*int)
找到一个最大值有点棘手,所以你应该试着找到一个列表尾部的最大值,然后将它与一个头部进行比较
我希望这有帮助。我的代码是:
fun the_oldest_date(date_list : (int * int * int) list) : (int * int * int) option =
let
fun older_date(date1:(int * int * int) , date2:(int * int * int)) : bool =
if #1 date1 < #1 date2
then true
else if #1 date1 = #1 date2
then if #2 date1 < #2 date2
then true
else if #2 date1 = #2 date2
then if #3 date1 < #3 date2
then true
else false
else false
else false
in
if null date_list
then NONE
else
let
val prevMax = the_oldest_date(tl date_list)
in
if prevMax = NONE
then SOME(hd date_list)
else if older_date(hd date_list, valOf prevMax)
then SOME(hd date_list)
else prevMax
end
end
fun最早的日期(日期列表:(int*int*int)列表):(int*int*int)选项=
让
日期(日期1:(int*int*int),日期2:(int*int*int)):bool=
如果#1日期1<#1日期2
那是真的
否则,如果#1 date1=#1 date2
那么如果#2 date1<#2 date2
那是真的
如果#2 date1=#2 date2
那么如果#3 date1<#3 date2
那是真的
否则错误
否则错误
否则错误
在里面
如果日期列表为空
那就没有了
其他的
让
val prevMax=最早的日期(tl日期列表)
在里面
如果prevMax=NONE
然后是一些(hd日期列表)
否则,如果日期较旧(hd日期列表,valOf prevMax)
然后是一些(hd日期列表)
艾尔斯普雷维马克斯
结束
结束
有三个问题
首先,你忘了括号
SOME older_date(hd date_list, the_oldest_date(tl date_list))
正如SML告诉您的,这被解释为
(SOME older_date) (hd date_list, the_oldest_date(tl date_list))
而且一些较旧的日期不是函数
自较旧的\u日期起
具有类型
(int * int * int) * (int * int * int) -> int * int * int
((int * int * int) * (int * int * int) -> int * int * int) option
某些较旧的日期具有类型
(int * int * int) * (int * int * int) -> int * int * int
((int * int * int) * (int * int * int) -> int * int * int) option
你应该成功
SOME (older_date(hd date_list, the_oldest_date(tl date_list)))
(函数应用程序关联到左侧,因此abc
表示(abc)c
,而不是abc)
但由于第二个问题,这也行不通
第二个问题是:<代码> TyOListDyDATE < /Cult>返回<代码> int *int *选项< />代码,而<>代码> OLDRYDATE < /COD>期待<代码> int *int *<代码>(您可能需要考虑更具体的数据类型-不可能知道日期的哪个部分在这里)。
您需要检查最早的日期(tl date\u list)
的结果,看看它是否真的返回了一些内容,然后再将其传递给比较函数
第三个问题是你的约会比较有点古怪。
据我所知,你声称没有任何日期早于2014年1月1日。
我对此表示怀疑。即使我不使用它们,它也会抱怨。据我所知,您的旧日期函数应该将日期列表作为参数,并吐出最早的日期。因此您有一些(旧日期列表)。即使我不使用它们,它也会抱怨你确定你的older_date函数为你提供了最早的日期吗?把它放到the_Olested_date函数之外,检查它是否真的为你提供了date_列表中最早的_日期。所以,你必须从某个地方开始。下一步:the_Olested_date
返回一个选项,其中有一个调用到older\u date
。到目前为止还不错。但是它打算如何返回它呢?通过调用SOME
。SOME
将需要一些括号,因为编译器抱怨它是一个运算符而不是一个函数
,请尝试SOME(older date(…)
。同时较旧的\u日期
,希望用2个日期调用,即2个(int*int*int)
,或sml显示的(int*int*int)*(int*int*int)
确实已经将第一个日期作为日期输入,但第二个日期是另一个调用最早的日期
,它将返回一个选项
。我们现在几乎忘记了较老的日期
需要另一个(int*int*int)
那里没有选项
?如果是这样,那么让我们对绘图进行另一个扭曲,并通过在上面使用valOf
来提取所述选项的内容:valOf(最早的日期(…)
。因此,对最后一个else
的完整更正是else一些(最早的日期(hd date,valOf(最早的日期(tl date_list)))
。可以编译。你试过吗?它说错误:运算符不是函数[tycon不匹配]--最早的日期([(2005,1,11),(2006,1,11)])加载文件到sml后,我得到:val最早的日期=fn:(int*int*int)list->(int*int*int)选项val it=():unit和之后:最早的日期([(2005,1,11),(2006,1,11)];我得到的是:val it=SOME(2005,1,11):(int*int*int)选项,而不是,那么如果#3 date1<#3 date2则为真,否则为假
你可以说然后#3 date1