【问题标题】:OCAML how to find the next element of the variantOCAML 如何找到变体的下一个元素
【发布时间】:2013-04-05 13:49:05
【问题描述】:

我有 -> 类型 week = MON |周二 | WED……我想明天创建第二天返回的函数!例如,如果我调用“明天 MON”,该函数将返回 TUE。

【问题讨论】:

    标签: types ocaml variant


    【解决方案1】:

    没有允许您执行此操作的内置语言结构。所以你应该自己写函数:

    let tomorrow = function
      | MON -> TUE
      | TUE -> WED
      ...
    

    另一种可能是实现这些功能:

    val int_of_week: week -> int
    val week_of_int: int -> week
    

    碰巧用 Obj.magic 编写这些函数很简单。他们将允许您在明天实施:

    let tomorrow w =
      week_of_int ((int_of_week w + 1) mod 7)
    

    这可能更接近您的想法。

    但这种解决方案不太安全:

    • 函数明天假设 int_of_week MON = 0,int_of_week TUE = 1 等等;
    • 对于不在 0 到 6 之间的整数,您需要记录 week_of_int 的行为;
    • 最后但同样重要的是,Obj.magic 实际上并不是该语言的一部分。

    【讨论】:

      【解决方案2】:

      与 Haskell 不同,你不能只做 deriving(Ord) 并调用 succ/pred 您将不得不手动编写这些函数。例如

      let tomorrow = function
        | MON -> TUE
        | TUE -> WED
        | (* etc.. *)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多