是否有可能在OCaml中实现这种完全多态?

Jac*_*ale 4 ocaml functional-programming

在OCaml

    let nth_diff_type i (x, y, z) =
        match i with
         1 -> x
        |2 -> y
        |3 -> z
        |_ -> raise (Invalid_argument "nth")
Run Code Online (Sandbox Code Playgroud)

那么目前的类型是int->('a,'a,'a)->'a吧?

这意味着x,y,z必须具有相同的类型.

所以我的问题是,是否可以赋予它最大的多态性,以便x,y,z不需要具有相同的类型?

pad*_*pad 8

不,不是.

OCaml中的函数应该只有一种返回类型.如果返回类型是唯一的,则可以使用不同的参数类型:

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

// val nth_diff_type :
//   int -> 'a * 'b * 'c -> [> `Fst of 'a | `Snd of 'b | `Thd of 'c ] = <fun>
Run Code Online (Sandbox Code Playgroud)

如果您想为三元组创建一些实用程序函数,遗憾的是您必须单独定义它们:

let fst3 (x, _, _) = x
let snd3 (_, y, _) = y
let thd3 (_, _, z) = z
Run Code Online (Sandbox Code Playgroud)