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不需要具有相同的类型?
不,不是.
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)