我正在尝试这个:
type TS1<'state, 'action> = {
actions : 'state -> #seq<'action>
move : 'state -> 'action -> 'state
state0 : 'state
}
但类型检查器不允许我:
.../stdin(2,29):error FS0715: Anonymous type variables are not permitted in this declaration
然而,如果我展开灵活类型的定义,我很好:
type TS2<'state, 'action, 'actions when 'actions :> seq<'action>> = {
actions : 'state -> 'actions
move : 'state -> 'action -> 'state
state0 : 'state
}
我对必须添加感到不满意'actions
类型变量——它使得与作为数学对象的确定性转换系统的联系不那么明显。
我不知道在记录定义中允许灵活的类型会出现什么问题。这有什么危险吗?还有其他方法可以获得我想要的定义的清晰度吗?
Update。我希望能够在 TS 类型上编写利用已知实现的函数;即,我希望能够定义一个函数
let has_action a ts s = Set.contains a <| ts.actions s
如果 actions 成员的类型是,这显然不会输入actions : 'state -> seq<'action>
。我可以用第二个定义来做到这一点,在这种情况下has_action
有类型
has_action : a:'a -> ts:TS2<'s,'a,Set<'a>> -> s:'s -> bool when 'a : comparison
此示例的类型表明 TS1 中的灵活类型可能没有帮助。有没有办法避免TS2中乱七八糟的第三种类型参数?在我看来,状态操作集合的确切实现是一个不应在类型中公开的实现细节。