我和F#一起工作了几个月,但没有找到任何令人满意的解决方案来解决我的问题.我想将一系列操作描述为有价值的价值联合或对这些价值的操作.这样,我的类型Val <'o>定义如下:
type Val<'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<'a>
| Func2 of ('a->'b->'o) * Val<'a> * Val<'b>
Run Code Online (Sandbox Code Playgroud)
Val <'o类型可以通过递归应用所有操作转换为'o类型,并且仍然保留操作列表.
但是,如果我不使用Val <'a,'b,'o>,我无法定义泛型类型'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>
Run Code Online (Sandbox Code Playgroud)
是否有任何F#结构可以适应这个问题?
非常感谢
[编辑]
为了进一步描述我的问题,我试图详尽地描述FRP结构(但是对于值的事件/信号,通用性问题是相同的).
表示可以序列化以用于数据库存储,转换为文本以供显示和用户编辑或评估以获得结果:
"Func (x -> x²) (Val(3.4))" <--> representation <--> 11.56
|
user
Run Code Online (Sandbox Code Playgroud)
我使用PrimitiveValueunion类型使一个原型工作得很好,并将在运行时编译的字符串obj[] -> obj …