是否可以使一个函数接受具有相同定义的两个不同的求和类型?

尼克·祖伯

让我们考虑两种不同但相似的和类型:

(* 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实际上有两种类型的工作tt'当他们都和类型?

我知道在处理函数的类型时,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这与两者兼容tt',因为他们是真正的同类型的在这种情况下,而在我前面的例子,他们是独立的总和类型正好具有相同的结构。

因此,要重申我的问题,有可能是该函数f与这两种类型的实际工作tt'当他们都和类型?

我之所以问是因为我想知道是否必须为两者编写相同的函数,t并且t'(由于两种类型的处理方式完全相同,因此实际上是重复代码)。

帕特

没有

您的类型tt'可能具有相似的定义,但是它们是不同的类型。

但是,您可以解决这个问题。

由于您在评论中指出您无法控制类型声明,因此,我认为解决问题的唯一方法是函子方法。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为这两个具有相同定义的函数提供更通用的类型?

来自分类Dev

创建一个函数,该函数接受具有相同方法的两个不同对象

来自分类Dev

您可以使一个函数接受两种不同的数据类型吗?

来自分类Dev

定义两个具有相同名称但返回类型不同的方法是否合法?

来自分类Dev

是否可以在一个布局中制作两个具有相同ID的按钮?

来自分类Dev

链接具有相同定义的两个目标文件时出现多重定义错误

来自分类Dev

我在不同的jar中有两个具有相同名称和相同包结构的类。是否可以从jar中专门选择一个类?

来自分类Dev

是否可以在Haskell中定义一个具有两种可能类型输入参数的函数?

来自分类Dev

是否可以在Haskell中定义一个具有两种可能类型的输入参数的函数?

来自分类Dev

我可以使一个MySQL表的两个属性始终具有相同的值吗?

来自分类Dev

是否可以将两个具有不同签名的函数作为参数传递给另一个函数?

来自分类Dev

在XSD中,两个元素可以具有不同的名称但具有相同的类型吗?

来自分类Dev

在XSD中,两个元素可以具有不同的名称但具有相同的类型吗?

来自分类Dev

如何通过DI注入两个相同类型但具有一个属性不同的对象?

来自分类Dev

使用Univocity CSV解析器来解析具有相同定义但列数不同的两个不同文件

来自分类Dev

我可以定义具有相同属性但值不同的两个接口的联合类型吗?

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

是否可以创建具有两个具有相同名称的属性的类型?

来自分类Dev

我可以为具有相同属性名称的两个类定义一个公共接口吗?

来自分类Dev

我们可以定义两个具有相同名称但参数不同的函数吗?

来自分类Dev

如何在 C 中创建一个函数来检查两个矩阵是否具有相同的维度

来自分类Dev

两个具有相同名称的类可以跨两个不同的程序集位于同一个命名空间中吗?

来自分类Dev

在Java中,是否可以使用具有两个类型参数的泛型接口作为每个具有一个固定类型参数的子类型接口的基础?

来自分类Dev

一个 Pod 可以有两个具有相同镜像的容器吗?

来自分类Dev

Orion Context Broker实体可以具有两个名称相同但类型不同的属性吗?

来自分类Dev

Orion Context Broker实体可以具有两个名称相同但类型不同的属性吗?

来自分类Dev

两个不同页面上的两个元素是否可以在 HTML/CSS 中具有相同的 ID?

来自分类Dev

创建两个具有相同名称但参数类型不同的R函数

Related 相关文章

  1. 1

    如何为这两个具有相同定义的函数提供更通用的类型?

  2. 2

    创建一个函数,该函数接受具有相同方法的两个不同对象

  3. 3

    您可以使一个函数接受两种不同的数据类型吗?

  4. 4

    定义两个具有相同名称但返回类型不同的方法是否合法?

  5. 5

    是否可以在一个布局中制作两个具有相同ID的按钮?

  6. 6

    链接具有相同定义的两个目标文件时出现多重定义错误

  7. 7

    我在不同的jar中有两个具有相同名称和相同包结构的类。是否可以从jar中专门选择一个类?

  8. 8

    是否可以在Haskell中定义一个具有两种可能类型输入参数的函数?

  9. 9

    是否可以在Haskell中定义一个具有两种可能类型的输入参数的函数?

  10. 10

    我可以使一个MySQL表的两个属性始终具有相同的值吗?

  11. 11

    是否可以将两个具有不同签名的函数作为参数传递给另一个函数?

  12. 12

    在XSD中,两个元素可以具有不同的名称但具有相同的类型吗?

  13. 13

    在XSD中,两个元素可以具有不同的名称但具有相同的类型吗?

  14. 14

    如何通过DI注入两个相同类型但具有一个属性不同的对象?

  15. 15

    使用Univocity CSV解析器来解析具有相同定义但列数不同的两个不同文件

  16. 16

    我可以定义具有相同属性但值不同的两个接口的联合类型吗?

  17. 17

    在两个表之间具有2个一对多关系是否可以接受?

  18. 18

    在两个表之间具有2个一对多关系是否可以接受?

  19. 19

    是否可以创建具有两个具有相同名称的属性的类型?

  20. 20

    我可以为具有相同属性名称的两个类定义一个公共接口吗?

  21. 21

    我们可以定义两个具有相同名称但参数不同的函数吗?

  22. 22

    如何在 C 中创建一个函数来检查两个矩阵是否具有相同的维度

  23. 23

    两个具有相同名称的类可以跨两个不同的程序集位于同一个命名空间中吗?

  24. 24

    在Java中,是否可以使用具有两个类型参数的泛型接口作为每个具有一个固定类型参数的子类型接口的基础?

  25. 25

    一个 Pod 可以有两个具有相同镜像的容器吗?

  26. 26

    Orion Context Broker实体可以具有两个名称相同但类型不同的属性吗?

  27. 27

    Orion Context Broker实体可以具有两个名称相同但类型不同的属性吗?

  28. 28

    两个不同页面上的两个元素是否可以在 HTML/CSS 中具有相同的 ID?

  29. 29

    创建两个具有相同名称但参数类型不同的R函数

热门标签

归档