从构造函数的泛型提取
|
在F#和OCaml中,我编写了很多代码,例如
type C = Blah of Whatever
let d = Blah (createWhatever ()) // so d is type C
...
let x = match d with | Blah b -> b
我想要的是
...
let x = peel d
在哪里pepe适用于任何构造函数/判别器。
当然,我不是唯一一个为此烦恼的人。
编辑:
好的答案,但我没有代表对它们进行投票。
这种情况怎么样?
member self.Length = match self with | L lab -> lab.Length
没有找到相关结果
已邀请:
4 个回复
鞋扣蚊冈借
是一个函数,它的类型是什么?它不能被键入,因此不能成为该语言中的“好人”。 你可以 : 使用反射(在F#中)或类型破坏函数(在OCaml中是
模块),但是使用不精确的类型会导致某些不安全的情况,因此使用起来非常丑陋,“使用风险自负” ” 使用元编程为每种类型生成
的不同版本。例如,使用类型转换OCaml工具,您可能具有
隐式定义函数
,而
定义
。 恕我直言,更好的解决方案是……首先不需要这样的
。我看到两种可能性: 您可以使用巧妙的模式而不是功能:通过使用
或
,您不再需要解包功能。 或者,您可以写而不是写
这样,您就没有总和类型,而是产品类型(您写
),而
就是
。每个
,
等仍然具有不同(不兼容)的类型,但是具有统一的访问接口。
久坡
岭取
对于您的第二种情况,我喜欢Laurent的《ѭ23》。
课刊灭似
顺便说一句:我通常不会做这样的事情,但是既然你问...