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