【发布时间】:2016-11-13 17:51:19
【问题描述】:
我已经使用 F# 工作了几个月,但没有为我的问题找到任何令人满意的解决方案。 我想将一系列操作描述为值的有区别的联合,或对这些值的操作。 这样,我的类型 Val 定义如下:
type Val<'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<'a>
| Func2 of ('a->'b->'o) * Val<'a> * Val<'b>
类型 Val 可以通过递归应用所有操作转换为 'o 类型,并且仍然保留操作列表。
但如果我不使用 Val,我将无法定义泛型类型 'a 和 'b 及其约束。 如果我这样做了,我必须定义 sub-Val 泛型类型,我想保持泛型:
type Val<'a, 'b, 'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<?, ?, 'a>
| Func2 of ('a->'b->'o) * Val<?, ?, 'a> * Val<?, ?, 'b>
是否有任何 F# 结构可以适应这个问题?
非常感谢
[编辑]
为了进一步描述我的问题,我试图获得 FRP 结构的详尽表示(但通用性问题对于事件/信号与值相同)。
表示可以被序列化以用于数据库存储,翻译成文本以供显示和用户编辑或评估以获得结果:
"Func (x -> x²) (Val(3.4))" <--> representation <--> 11.56
|
user
我使用 PrimitiveValue 联合类型制作了一个运行良好的原型,并将函数字符串在运行时编译为通用 obj[] -> obj 函数,但评估在类型检查和强制转换方面非常繁重(特别是因为我还使用数组和PrimitiveValue 中的选项),所以我一直在寻找更优雅和强类型的解决方案。
【问题讨论】:
标签: generics f# discriminated-union