2013-03-11 93 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