gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:48:22 24 4
gpt4 key购买 nike

我正在尝试这个:

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 成员的类型是 actions : 'state -> seq<'action> ,这显然不会输入。我可以用第二个定义来做到这一点,在这种情况下 has_action有类型

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

此示例的类型表明 TS1 中的灵活类型可能没有帮助。有没有办法避免TS2中乱七八糟的第三种类型参数?在我看来,状态操作集合的确切实现是一个不应在类型中公开的实现细节。

最佳答案

你在这里几乎回答了你自己的问题......第二个选项有效,因为你引入了另一种类型参数,即你对'actions进行抽象。关键是,您无法真正在记录定义中定义通用值。请考虑,第二个选项在类型方面不是通用的,因为定义了 'state'actions

关于f# - 为什么记录类型定义中不允许使用灵活类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com