【发布时间】:2015-03-26 10:49:49
【问题描述】:
我正在尝试这个:
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 类型变量感到不满意——它使与确定性转换系统的连接作为数学对象变得不那么明显。
我看不出在记录定义中允许灵活类型会出现什么问题。有什么危险吗?有没有其他方法可以获得我想要的明确定义?
更新。我希望能够在利用已知实现的 TS 类型上编写函数;即,我希望能够定义一个函数
let has_action a ts s = Set.contains a <| ts.actions s
如果操作成员的类型是actions : 'state -> seq<'action>,这显然不会输入。我可以用第二个定义来做,在这种情况下has_action 有类型
has_action : a:'a -> ts:TS2<'s,'a,Set<'a>> -> s:'s -> bool when 'a : comparison
此示例的类型表明 TS1 中的灵活类型可能无济于事。有没有办法避免TS2中凌乱的第三类参数?在我看来,一个状态的动作集合的确切实现是一个不应该在类型中公开的实现细节。
【问题讨论】:
-
如果您从
seq之前删除#,它将为我编译。 -
@MarkPattison 有一个很好的观点 - 删除
#更容易 - 你为什么认为你需要它? -
关于您的更新 IMO,第三个参数是您记录的重要组成部分,所以不,我认为您不应该在这里删除它(顺便说一句:您不必输入它 - 您可以如果您愿意,请改用
_)-如果您想知道(但在这里无济于事):您可以使用forall量化的唯一地方是(接口)成员(我在这里写过类似的问题:gettingsharper.de/2014/09/29/…) -
是的,看看
has_parents的类型,似乎没有办法绕过第三个类型参数。
标签: f# record flexible-type