让我们考虑两种不同但相似的和类型:
(* Two different types, but same/similar definitions *)
type t = Foo of int
type t' = Foo of int
然后让我们想象一下,我们有一个函数可以按面值使用任何一种类型:
(* Function that could work with either t or t' *)
let f x =
match x with
| Foo n -> n
是否有可能该功能f
实际上有两种类型的工作t
和t'
当他们都和类型?
我知道在处理函数的类型时,x
将推断出它具有type t'
,然后与type不兼容t
。
let _ =
let (a : t) = Foo 1 in
let (a' : t') = Foo 1 in
let _ = f a' in (* This is fine. *)
let _ = f a in (* This will throw a type error. *)
()
另外,我知道使用更简单的类型可以正常工作,例如:
type t = int
type t' = int
let g x = x + 1
let _ =
let (a : t) = 1 in
let (a' : t') = 1 in
let _ = g a' in (* This is fine. *)
let _ = g a in (* This is fine. *)
()
我猜这是因为作品g
将获得推断有型int -> int
这与两者兼容t
和t'
,因为他们是真正的同类型的在这种情况下,而在我前面的例子,他们是独立的总和类型正好具有相同的结构。
因此,要重申我的问题,有可能是该函数f
与这两种类型的实际工作t
和t'
当他们都和类型?
我之所以问是因为我想知道是否必须为两者编写相同的函数,t
并且t'
(由于两种类型的处理方式完全相同,因此实际上是重复代码)。
您的类型t
和t'
可能具有相似的定义,但是它们是不同的类型。
但是,您可以解决这个问题。
由于您在评论中指出您无法控制类型声明,因此,我认为解决问题的唯一方法是函子方法。
type a = A
type a' = A
module type T = sig type t = A end
module A ( X : T ) = struct open X let f = function A -> () end
module T1 = struct type t = a = A end
module T2 = struct type t = a' = A end
module A1 = A(T1)
module A2 = A(T2)
但是,如果库为您提供了两种这样的类型,则很可能有其原因,并且有一种做库本身提供的不同方法的方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句