我已经使用F#工作了几个月,但没有找到满意的解决方案来解决我的问题。 我想把一系列操作描述为值的区分联合,或对这些值进行的操作。 以这种方式,我的类型Val<'o>定义如下:
type Val<'o> =
| Val of 'o
| Func1 of ('a->'o) * Val<'a>
| Func2 of ('a->'b->'o) * Val<'a> * Val<'b>
类型Val<'o>可以通过递归应用所有操作转换为'o类型,并仍保留操作列表。
但是,如果我不使用Val<'a,'b,'o>,我无法定义通用类型'a'和'b'及其约束条件。 如果这样做,我必须定义子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
中使用了数组和选项,所以评估过程对类型检查和转换的要求非常高,因此我正在寻找一种更优雅和强类型的解决方案。
IFuncOperation<_,_>
中再次应用Val<_>
将'T1 -> 'T2
包装起来,可以以一种不错的方式将任意柯里化度数的函数应用于相应数量的Val<_>
。 - kvb