在OCaml中假设给出了一种类型:
('a myTypeA) myTypeB
如果类型x
的值为'a myTypeA myTypeB
,是否存在特定于OCaml的内置,以获取类型y
的值'a myTypeA
(基本上是对...进行解构输入并删除myTypeB
)?
我正在寻找带签名的功能:
val deconstruct : 'a myTypeA myTypeB -> 'a myTypeA
答案 0 :(得分:0)
你不能,除非你能看到myTypeB
的定义,以及原因:
没有什么可以阻止您创建以下类型:
type 'a t = int (* here 'a is called a "phantom type" *)
type 'a u = unit -> 'a (* the type of functions that return an 'a *)
现在,没有办法提取" 'a
值"包含"。这是因为类型参数并不总是"包含的值的类型"但是可以表示各种不同的东西(在第一个例子中,什么都没有)。
如果这似乎有限制,请注意即使在容器的情况下,您也可能不希望允许deconstruct
函数存在。如果您开始使用monads,可以了解更多相关信息。