Function 函数返回给定日期前n天的日期

Function 函数返回给定日期前n天的日期,function,recursion,functional-programming,ocaml,Function,Recursion,Functional Programming,Ocaml,因此,我希望构建一个函数,该函数接受int和下面我的day类型的day,并返回给定日期前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;

因此,我希望构建一个函数,该函数接受int和下面我的day类型的day,并返回给定日期前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;
;; 
我希望构建一个如上所述的函数,我认为它需要对next进行递归调用,以不断增加一天,直到它提前n天,但我完全不知道如何在OCaml中定义它。我尝试过定义一些东西,但到目前为止,只创建了一个函数,该函数执行与next相同的操作,例如:

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

我觉得这很接近,但我们都知道,接近只算作马蹄铁和手榴弹。有人知道我如何继续吗?

首先,代码中的f7是什么。事实上,fn符号应该是什么意思

如果我理解正确,您正在寻找这样的函数:

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

首先,代码中的f7是什么。事实上,fn符号应该是什么意思

如果我理解正确,您正在寻找这样的函数:

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

哦,对不起,我更改了一份副本的名称,但没有更改另一份,让我编辑!这个条表示d可以是不同的东西,对吗?我们可以修改它,使初始函数接受一个int和一天吗?比如让next\n:int d:day:day=…是的,你可以。函数只是一个简单的语法,用于在我们的示例中获取参数n:int并立即对其进行模式匹配。您可以将我的示例改写为:让rec next\n d n=match n with。。。这将是同等的。还请注意,类型注释不是必需的。OCaml会推断出来的。啊,好吧,这是我比较熟悉的风格。非常感谢。你会经常看到这两种样式,所以熟悉这两种样式还是不错的。哦,对不起,我更改了一个副本的名称,但没有更改另一个,让我编辑!这个条表示d可以是不同的东西,对吗?我们可以修改它,使初始函数接受一个int和一天吗?比如让next\n:int d:day:day=…是的,你可以。函数只是一个简单的语法,用于在我们的示例中获取参数n:int并立即对其进行模式匹配。您可以将我的示例改写为:让rec next\n d n=match n with。。。这将是同等的。还请注意,类型注释不是必需的。OCaml会推断出来的。啊,好吧,这是我比较熟悉的风格。非常感谢。你会经常看到这两种风格,所以熟悉这两种风格还是不错的。