2013-03-11 76 views
1

因此,我正在構建一個函數,它需要一個int和一天(我的日子類型在下面)並返回給定日期前n天。函數返回給定日前n天

我有一天類型定義爲

type day = Sun | Mon | Tues | Wed | Thurs | Fri | Sat;; 

,並返回到第二天功能:

let next (d:day) : day = 
    match d with 
    Mon -> Tues; 
| Tues -> Wed; 
| Wed -> Thurs; 
| Thurs -> Fri; 
| Fri -> Sat; 
| Sat -> Sun; 
| Sun -> Mon; 
;; 

我希望建立一個功能如上所述,我想它需要對下一個進行遞歸調用,以保持增長的一天,直到它提前n天,但我完全難以理解如何在OCaml中定義這一點。我試圖定義一些東西,但迄今只創造了不作爲下一個同樣的事情的功能,如:

let rec ndays (n:int) (d:day) : day = 
    if n=0 then next d else ndays (pred n) d;; 

我覺得這是接近,但我們都知道,靠近僅在計數馬蹄鐵和手榴彈。有沒有人有關於我可以如何繼續的提示?

回答

4

首先,代碼中的f7是什麼。事實上,fn符號應該是什麼意思?

如果我理解你正確地你正在尋找一個功能,像這樣:

let rec next_n d = function 
    | 0 -> d 
    | n -> next_n (next d) (pred n) 
# next_n : day -> int -> day 
+0

哦,對不起,我的一個副本更名而不是其他,讓我修改! – Bizzle 2013-03-11 21:41:07

+0

酒吧只是表示d可能是不同的東西吧?我們可以修改它嗎,這樣初始函數需要一個int和一天嗎?如let next_n(n:int)(d:day):day = ..... – Bizzle 2013-03-11 21:46:59

+1

是的,你可以。在我們的例子中,'function'只是一個簡短的語法,用於參數'n:int',並立即對它進行匹配。你可以重寫我的例子來閱讀:'讓rec next_n d n =與...匹配n',這將是等價的。另請注意,類型註釋不是必需的。 OCaml會推斷他們。 – rgrinberg 2013-03-11 21:48:00