加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

f# – 为什么记录类型定义中不允许使用灵活类型?

发布时间:2020-12-15 02:10:10 所属栏目:百科 来源:网络整理
导读:我正在尝试这个: 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 declaratio
我正在尝试这个:
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
}

我不满意必须添加’动作类型变量 – 它使得与确定性转换系统的连接成为数学对象不那么明显.

通过在记录定义中允许灵活类型,我看不出会出现什么问题.它有点危险吗?还有其他方法我可以得到我想要的清晰度吗?

更新.我希望能够在利用已知实现的TS类型上编写函数;即,我希望能够定义一个函数

let has_action a ts s = Set.contains a <| ts.actions s

如果动作成员的类型是动作,这显然不会输入:’state – > SEQ<’动作取代.我可以用第二个定义来做,在这种情况下has_action有类型

has_action : a:'a -> ts:TS2<'s,'a,Set<'a>> -> s:'s -> bool when 'a : comparison

此示例的类型表明TS1中的灵活类型可能无济于事.我无法避免TS2中凌乱的第三类参数?在我看来,状态的动作集合的确切实现是一个不应该在类型中公开的实现细节.

解决方法

这只是当前编译器对允许类型的记录签名的实现的限制.例如,如果您在概念上以相同的方式定义类型,但使用接口或抽象类而不是记录,则编译良好:
type TS1<'state,'action> = 
    abstract actions : 'state -> #seq<'action>
    abstract move    : 'state -> 'action -> 'state
    abstract state0  : 'state

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读