【问题标题】:Function to return a day n days ahead of given day返回给定日期前 n 天的函数
【发布时间】:2013-02-27 05:49:40
【问题描述】:

所以我希望构建一个函数,该函数需要一个 int 和一个 day(下面是我的 day 类型)并返回给定日期前 n 天的日期。

我将类型 day 定义为

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

我觉得这很接近,但众所周知,接近只算马蹄铁和手榴弹。有人对我如何进行操作有任何提示吗?

【问题讨论】:

    标签: function recursion functional-programming ocaml


    【解决方案1】:

    首先,您的代码中的 f7 是什么。实际上,fn 表示法应该是什么意思?

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

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

    【讨论】:

    • 哦,抱歉,我更改了一份副本的名称,但没有更改另一份,让我编辑!
    • 横条只是表示 d 可能是不同的东西,对吧?我们可以修改它,使初始函数接受 int 和 day 吗?比如 let next_n (n:int) (d:day) : day = .....
    • 是的,你可以。 function 只是在我们的示例中采用参数n : int 并立即对其进行模式匹配的简写语法。您可以将我的示例重写为:let rec next_n d n = match n with ... ,它是等效的。另请注意,类型注释不是必需的。 OCaml 会推断它们。
    • 啊,好吧,这是我比较熟悉的风格。谢谢!
    • 你会经常看到这两种风格,所以熟悉这两种风格还是不错的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2012-08-12
    • 2015-07-26
    • 2011-01-12
    相关资源
    最近更新 更多