如何在OCaml中重写此函数,以便它允许元组的元素具有不同的类型
let nth i (x,y,z) =
match i with
1->x
|2->y
|3->z
|_->raise (Invalid_argument "nth")
答案 0 :(得分:3)
简短的回答是,这是不可能的。 OCaml是强类型和静态类型。函数返回单个类型。由于您的函数在不同情况下返回x
,y
和z
,因此这些函数必须都是相同的类型。
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"