Ocaml GADT模式匹配

Ocaml GADT模式匹配,ocaml,reason,Ocaml,Reason,我最近一直在玩弄gadt,想知道是否有人能为我指明正确的方向来学习如何键入它,以便它能够编译,如果可能的话,或者如果我把事情复杂化了 我在这里看到了一些关于GADT模式匹配的其他答案,但这似乎有点不同 我见过这种类型的东西用来表示没有可能值的类型: module Nothing = { type t = | Nothing(t); }; 所以我想用它来锁定这个Exit.t type,这样我就可以有一个Exit.t'a,Nothing.t类型来表示成功案例,捕捉到没有可恢复的失败值的

我最近一直在玩弄gadt,想知道是否有人能为我指明正确的方向来学习如何键入它,以便它能够编译,如果可能的话,或者如果我把事情复杂化了

我在这里看到了一些关于GADT模式匹配的其他答案,但这似乎有点不同

我见过这种类型的东西用来表示没有可能值的类型:

module Nothing = {
  type t =
    | Nothing(t);
};
所以我想用它来锁定这个Exit.t type,这样我就可以有一个Exit.t'a,Nothing.t类型来表示成功案例,捕捉到没有可恢复的失败值的事实

module Exit = {
  type t('a, 'e) =
    | Success('a): t('a, Nothing.t)
    | Failure('e): t(Nothing.t, 'e);
这似乎还可以,直到我尝试为它编写一个平面映射函数

  let flatMap: ('a => t('a1, 'e), t('a, 'e)) => t('a1, 'e) = (f, exit) =>
    switch (exit) {
    | Success(a) => f(a)
    | Failure(_) as e => e
    };
};
按原样,它推断Exit.t类型总是Exit.tNothing.t,Nothing.t,我有点理解,因为失败案例中的类型会将第一个类型设置为Nothing,而成功案例会将第二个类型设置为Nothing


我已经尝试了我知道的一件事,使用类型a使其中一些类型成为本地类型。我已经尝试过键入a1e并键入e离开a1,但我似乎无法捕捉到这个想法。

我使用下面的OCaml语法,因为问题也被标记为OCaml,但出于某种原因,这应该是正确的

首先,键入Nothing.t不是空的。循环值为零。。。是有效的居民。如果确实希望类型为空,请不要放置任何构造函数

第二,正如您所猜测的,在flat_映射中,您的失败分支强制将'a1'实例化为Nothing.t。这是没有办法的;这不是编译器的缺陷,只是解释此代码的唯一方法

第三,你把事情弄得有点太复杂了,因为退出。为了实现你的目标,t首先不必是一个游手好闲的人

下面是一个简单的例子,它表明,如果Nothing.t实际上为空,那么编译器就正确地允许不相关的分支

键入nothing=| 输入“a”和“b”结果= |a的成功 |b的失败 只让成功x:a,没有结果:a= 将x与 |成功v->v |失败->。*可以删除此分支,因为它是正确推断的*
我在使用下面的OCaml语法,因为问题也被标记为OCaml,但出于某种原因,应该是这样的

首先,键入Nothing.t不是空的。循环值为零。。。是有效的居民。如果确实希望类型为空,请不要放置任何构造函数

第二,正如您所猜测的,在flat_映射中,您的失败分支强制将'a1'实例化为Nothing.t。这是没有办法的;这不是编译器的缺陷,只是解释此代码的唯一方法

第三,你把事情弄得有点太复杂了,因为退出。为了实现你的目标,t首先不必是一个游手好闲的人

下面是一个简单的例子,它表明,如果Nothing.t实际上为空,那么编译器就正确地允许不相关的分支

键入nothing=| 输入“a”和“b”结果= |a的成功 |b的失败 只让成功x:a,没有结果:a= 将x与 |成功v->v |失败->。*可以删除此分支,因为它是正确推断的*
我不知道你会怎么用这个。如果您使用任何一个构造函数,您将在编译时强制其中一个类型变量为Nothing.t。不可能是别的。如果是这样,为什么不直接返回值呢?我假设您已经考虑了一些用例,但是我无法理解这是什么,这通常被称为探索性的。我试图实现这种类型,以便将一些Scala代码移植到OCaml。我不知道您将如何使用它。如果您使用任何一个构造函数,您将在编译时强制其中一个类型变量为Nothing.t。不可能是别的。如果是这样,为什么不直接返回值呢?我假设您已经考虑了一些用例,但是我无法理解这是什么,这通常被称为探索性的。我试图实现这种类型,以便将一些Scala代码移植到OCaml。