4

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

4

2 回答 2

5

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

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 实际上并不是该语言的一部分。
于 2013-04-05T14:07:22.217 回答
1

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

let tomorrow = function
  | MON -> TUE
  | TUE -> WED
  | (* etc.. *)
于 2013-04-05T14:05:33.190 回答