我试图从另一种类型中对一个值进行类型转换。
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.谢谢......!
答案 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
希望有所帮助。