在OCaml中编写具有不同返回类型的函数

时间:2014-07-21 19:07:30

标签: functional-programming ocaml

如何在OCaml中重写此函数,以便它允许元组的元素具有不同的类型

let nth i (x,y,z) = 
match i with
 1->x
|2->y
|3->z
|_->raise (Invalid_argument "nth")

2 个答案:

答案 0 :(得分:3)

简短的回答是,这是不可能的。 OCaml是强类型和静态类型。函数返回单个类型。由于您的函数在不同情况下返回xyz,因此这些函数必须都是相同的类型。

OCaml类型与所谓的动态类型语言中的类型不同。你需要以不同的方式思考。 (在我看来)这些好处是巨大的。

答案 1 :(得分:1)

可以这样做,但是您需要满足约束,即从函数返回的所有值都应该是一种类型的成员。最简单的解决方案是:

let nth i (x,y,z) =
  match i with
  | 1 -> `Fst x
  | 2 -> `Snd y
  | 3 -> `Thd z
  | _ -> invalid_arg "nth tuple"

该解决方案表明您需要针对元组类型解决所有可能的情况。否则,您的程序将不会格式正确,这与静态类型相矛盾。后者保证您的程序适用于任何输入,因此它不会在运行时失败。

使用普通ADT代替多态的双胞胎解决方案看起来像这样:

type ('a,'b,'c) t =
  | Fst of 'a
  | Snd of 'b
  | Thd of 'c

let nth i (x,y,z) =
  match i with
  | 1 -> Fst x
  | 2 -> Snd y
  | 3 -> Thd z
  | _ -> invalid_arg "nth tuple"

使用GADT形成存在类型的奇特解决方案(可能不太可行)将如下所示:

type t = Dyn : 'a -> t

let nth i (x,y,z) =
  match i with
  | 1 -> Dyn x
  | 2 -> Dyn y
  | 3 -> Dyn z
  | _ -> invalid_arg "nth tuple"