OCaml中的通用类型实现

时间:2013-12-05 05:02:03

标签: generics ocaml

有没有办法在Java或C#中实现支持泛型类型的异构类型的队列?

以下是Queue的模块类型。

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

而且,如果我需要实现整数队列,有没有办法实现它而不复制并粘贴上部enqdeq逻辑?

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

1 个答案:

答案 0 :(得分:4)

您可以编写多态队列:

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

您还可以编写一个函数队列,即一个由队列元素类型参数化的模块。

在任何一种情况下都不需要为每种不同的元素类型编写代码。

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