Generics OCaml中泛型类型的实现

Generics OCaml中泛型类型的实现,generics,ocaml,Generics,Ocaml,有没有一种方法可以实现支持异构类型(如Java或C中的泛型类型)的队列 下面是队列的模块类型 module type Queue = sig type element type queue exception EMPTY_Q val emptyq: queue val enq: queue * element -> queue val deq: queue -> element * queue end 如果我想实现字符串队列,我会像这样键入代码 modul

有没有一种方法可以实现支持异构类型(如Java或C中的泛型类型)的队列

下面是队列的模块类型

module type Queue = 
sig
  type element
  type queue
  exception EMPTY_Q
  val emptyq: queue
  val enq: queue * element -> queue
  val deq: queue -> element * queue
end
如果我想实现字符串队列,我会像这样键入代码

module StringQ : Queue with type element = string = 
struct 
  type element = string
  type queue = (* queue type *)
  exception EMPTY_Q
  let emptyq: queue = (* empty queue *)
  let enq: queue * element -> queue = 
    (* enqueue logic *)
  let deq: queue -> element * queue = 
    (* dequeue logic *)
end
那个么,若我需要实现整数队列,有并没有一种不用复制粘贴上层enq、deq逻辑的方法来实现它


我认为无论元素类型如何,enq和deq逻辑都是相同的。

您可以编写一个多态队列:

exception EMPTY_Q
type 'a q = Q of 'a list * 'a list
let pq_empty = Q ([], [])
let pq_enqueue (Q (a, b)) c = Q (a, c :: b)
let rec pq_dequeue (Q (a, b)) =
    match a, b with
    | [], [] -> raise EMPTY_Q
    | [], _ -> pq_dequeue (Q (List.rev b, []))
    | h :: t, _ -> (h, Q (t, b))
您还可以编写函数队列,即通过队列元素的类型参数化的模块

在这两种情况下,都不需要为每种不同的元素类型编写代码


但是,在这两种情况下,队列都是同质的,即任何一个队列的所有元素都属于相同的类型。

您可以编写多态队列:

exception EMPTY_Q
type 'a q = Q of 'a list * 'a list
let pq_empty = Q ([], [])
let pq_enqueue (Q (a, b)) c = Q (a, c :: b)
let rec pq_dequeue (Q (a, b)) =
    match a, b with
    | [], [] -> raise EMPTY_Q
    | [], _ -> pq_dequeue (Q (List.rev b, []))
    | h :: t, _ -> (h, Q (t, b))
您还可以编写函数队列,即通过队列元素的类型参数化的模块

在这两种情况下,都不需要为每种不同的元素类型编写代码


但是,在这两种情况下,队列都是同质的,即任何一个队列的所有元素都属于同一类型。

谢谢Jeffrey。我知道你回答中的队列可以用于任何元素类型。但我的问题是,有没有一种方法可以在没有代码冗余的情况下实现许多特定于类型的队列?。不是出于实际目的,只是出于好奇。但我想没有这样的方法。你可以用函子来做。啊哈,我明白了。非常感谢:谢谢你,杰弗里。我知道你回答中的队列可以用于任何元素类型。但我的问题是,有没有一种方法可以在没有代码冗余的情况下实现许多特定于类型的队列?。不是出于实际目的,只是出于好奇。但我想没有这样的方法。你可以用函子来做。啊哈,我明白了。谢谢: