2013-10-13 25 views
2

我不知道,我怎麼能找到在列表中的最早日期:獲取最小元素(運營商是不是函數[tycon不匹配])

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 

我想不在這裏使用任何庫函數,只有遞歸和標準ML設施。 而我得到的錯誤

Error: operator is not a function [tycon mismatch] 
    operator: ((int * int * int) * (int * int * int) -> int * int * int) option 
in expression: 
    (SOME older_date) (hd date_list,the_oldest_date (tl date_list)) 
/usr/lib/smlnj/bin/sml: Fatal error -- Uncaught exception Error with 0 

回答

2

亞歷克斯,

您older_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 
+0

你試過了嗎?它說錯誤:運算符不是函數[tycon不匹配] - the_oldest_date([(2005,1,11),(2006,1,11)]) –

+0

加載文件到sml後得到:val the_oldest_date = fn: (int * int * int)list - >(int * int * int)option val it =():unit – user987339

+0

After:the_oldest_date([(2005,1,11),(2006,1,11)]) ;我得到:val it = SOME(2005,1,11):(int * int * int)選項 – user987339

0

SML是因爲你使用的選項類型抱怨。 'a option = NONE | SOME of 'a(SOME older_date)...中的參數應該是單個元素,它應該是您的最早日期。

+0

即使我不使用它們,它也會抱怨。 –

+0

據我所知,您的old_date函數應該將date_list作爲參數並吐出最早的日期。所以你有一些(old_date date_list)。 – Krishna

+0

即使我不使用它們,它也會投訴 –

0

好的。首先要刪除最後andalso裏面的older_date

+0

這只是一個錯字。 –

+0

等等,但你必須從某個地方開始。接下來:'the_oldest_date'返回一個選項,在其中調用'older_date'。到現在爲止還挺好。 – FoggyDew

+0

但它是如何返回它?通過調用'SOME'。 'SOME'將需要一些括號,因爲編譯器會抱怨'它不是函數的操作符',請嘗試'SOME(更早的日期(...))'。與此同時''old_date''預計會被調用2個日期,即2'(int * int * int)',或者如sml顯示它''(int * int * int)*(int * int * int)作爲一個日期已經被第一個餵食了,但第二個是另一個調用'the_oldest_date'的函數,它將返回一個'option'。現在我們幾乎已經忘記了'older_date'需要另一個'(int * int * int)'而不是'option'? – FoggyDew

0

我會將每個日期轉換爲時期,然後比較整數。喜歡的東西

epoch = (#1 date-1) * 365 + daysBeforeMonth(#2 date) + (#3 date) 
1

有三個問題。

首先,你在

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)) 

SOME older_date是不是一個功能。

由於older_date具有類型

(int * int * int) * (int * int * int) -> int * int * int 

SOME older_date具有類型

((int * int * int) * (int * int * int) -> int * int * int) option 

你應該讓

SOME (older_date(hd date_list, the_oldest_date(tl date_list))) 

(功能應用關聯到左邊,所以a b c意味着(a b) c不是a (b c)

除了這也不行,因爲第二個問題。

的第二個問題是,the_oldest_date返回int * int * int option,而older_date預計的int * int * int(你可能要考慮一個更具體的數據類型 - 這是不可能分辨出哪部分日期是在這裏)。
您需要檢查the_oldest_date (tl date_list)的結果,以確定它是否在將其傳遞給比較函數之前實際返回了某些內容。

第三個問題是你的日期比較有點時髦。
據我所知,你聲稱沒有日期有史以來是比2014年1月1日早。
我有我的懷疑。