如何在ocaml中对类值进行类型转换

时间:2014-04-16 22:26:10

标签: ocaml ml

我试图从另一种类型中对一个值进行类型转换。

type days =
  | Mon | Tue | Wed | Thu | Fri | Sat

type ('a, 'b) holidays = H of 'a | W of 'b
(* H: holiday, W: Working *)

let my_list = [H Mon; H Tue; W Wed]

从上面的my_list中,我想提取“Mon”而不是“H Mon”。如何在不对

等模式匹配进行硬编码的情况下进行操作
let result day = match day with
| H Mon -> Mon

等?

那就是我想提取my_list的第一个元素,好像我从未应用参数化构造H或W.谢谢......!

1 个答案:

答案 0 :(得分:3)

如果它们总是为type = days,则不需要允许('a,'b)为不同的类型。如上所述,如果“结果”函数实际上不同,则不能任意返回“a”或“b”的返回值。结果函数的返回类型必须是'a或'b。

有100种方法可以解决这个问题。在这里你只需要将H和W的内部类型限制为同一个东西:

type 'a holiday = |H of 'a |W of 'a

let head_of_holiday_list = fun holiday_list -> begin
   let first_day::xs = holiday_list in
   match first_day with
   |H(x) -> x
   |W(x) -> x
   end

或者,您可以完全分开假日和日期,并将您的列表正式化为称为日历的内容,该日历由两种类型的对组成。这可能是解耦这两种类型的更简洁方法:

type day_of_week = |Mon |Tues |Wed ..
type kind_of_day = |Holiday |Workday
type calendar = (day_of_week, kind_of_day) list

let first_day_of_week_in_calendar = fun calendar -> begin
  let (day_of_week_x, kind_of_day_y)::xs = calendar in
  day_of_week
  end

希望有所帮助。