3

在基于 fsycc 的项目中,我有这一行:

type 'a cucomment = string

这是我得到的完整错误描述:

CALast.fs(117,9):错误 FS0035:不推荐使用此构造:此类型缩写具有一个或多个声明的类型参数,这些参数未出现在被缩写的类型中。类型缩写必须使用被缩写类型中所有声明的类型参数。考虑删除一个或多个类型参数,或使用包装底层类型的具体类型定义,例如'type C<'a> = C of ...'。

知道如何解决这个问题吗?

4

1 回答 1

3

F# 不再允许在不声明新类型的情况下将泛型类型参数添加到类型的类型别名。如果要定义包装其他类型的泛型类型,则必须使用一些构造函数。例如,您可以使用单例区分联合:

type 'a Cucomment = CC of string

不幸的是,这意味着您必须更改所有使用该类型的代码,以使用模式匹配或Value向该类型添加成员来解包该值。

唯一允许使用泛型类型别名的情况是当您声明具有度量单位的类型版本时,这需要特殊属性。但是,这可能对您不起作用(因为单位的行为完全不同):

[<MeasureAnnotatedAbbreviation>]
type 'a Cucomment = string 

如果这是在fsyacc生成的某些代码中,那么这是 fsyacc 中应该修复的错误(我认为这是最近的更改)。在这种情况下,请向fsbugsdotmicrosoft报告com

于 2012-03-23T12:02:18.380 回答