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

Functional programming 在OCaml中编写具有不同返回类型的函数,functional-programming,ocaml,Functional Programming,Ocaml,如何在OCaml中重新编写此函数,使元组的元素具有不同的类型 let nth i (x,y,z) = match i with 1->x |2->y |3->z |_->raise (Invalid_argument "nth") 简而言之,这是不可能的。OCaml是强静态类型的。函数返回单个类型。由于函数在不同的情况下返回x、y和z,因此它们必须是相同的类型 OCaml类型与所谓的动态类型语言中的类型不同。你需要有不同的想法。(在我看来)好处是巨大的。简而言之,这

如何在OCaml中重新编写此函数,使元组的元素具有不同的类型

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

简而言之,这是不可能的。OCaml是强静态类型的。函数返回单个类型。由于函数在不同的情况下返回
x
y
z
,因此它们必须是相同的类型


OCaml类型与所谓的动态类型语言中的类型不同。你需要有不同的想法。(在我看来)好处是巨大的。

简而言之,这是不可能的。OCaml是强静态类型的。函数返回单个类型。由于函数在不同的情况下返回
x
y
z
,因此它们必须是相同的类型


OCaml类型与所谓的动态类型语言中的类型不同。你需要有不同的想法。在我看来,这样做的好处是巨大的。

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

let nth i (x,y,z) =
  match i with
  | 1 -> `Fst x
  | 2 -> `Snd y
  | 3 -> `Thd z
  | _ -> invalid_arg "nth tuple"
该解决方案表明,您需要解决元组类型的所有可能情况。否则,您的程序将不会是格式良好的,这与静态类型相矛盾。后者保证您的程序对于任何输入都是格式良好的,因此它在运行时不会失败

使用普通ADT而不是多态性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"
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"
使用GADT形成存在类型的奇特解决方案(可能不是很实用)将如下所示:

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"
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"

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

let nth i (x,y,z) =
  match i with
  | 1 -> `Fst x
  | 2 -> `Snd y
  | 3 -> `Thd z
  | _ -> invalid_arg "nth tuple"
该解决方案表明,您需要解决元组类型的所有可能情况。否则,您的程序将不会是格式良好的,这与静态类型相矛盾。后者保证您的程序对于任何输入都是格式良好的,因此它在运行时不会失败

使用普通ADT而不是多态性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"
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"
使用GADT形成存在类型的奇特解决方案(可能不是很实用)将如下所示:

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"
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"