3

我最近一直致力于为 TypeScript 0.9.1 定义生成 FFI 代码。我遇到了这个问题...

这段代码:

    type 'T IList with
        member __.ConcatWith<'U when 'U :> 'T IList>(items : 'U) : 'T[] = failwith "not implemented"

产生这种类型的错误:

未定义类型参数“T”。

注意:此错误仅发生在类型约束部分内。在其他地方使用泛型类型参数(例如,作为返回类型)可以正常工作。

但是,如果我定义一个类型而不是类型扩展,那很好。不幸的是,我没有这种奢侈。我定义的扩展有时需要在单独的程序集中。

我知道该[<Extension>]属性,但我希望这些扩展可以从 F# 内部使用(对于 FunScript 项目)。

我可以把方法放在一个module. 然而,这些方法将更难被发现。这不是我想要的。

我可以使用 C#。但是,我将无法添加扩展索引和属性。因此,这是不可接受的。

有没有解决这个问题的方法?

我在想我可能不得不解除类型限制。例如:ConcatWith<'U when 'U :> 'T IList>(items : 'U)将变为:ConcatWith(items : 'T IList)

4

1 回答 1

2

这对我来说似乎是一个错误。

如果您实际需要表达的约束是此处示例中的约束 ( 'U :> 'T IList),那么我认为您可以使用#IList<'T>type 解决它(但这不适用于更复杂的约束):

type 'T IList with
    member __.ConcatWith(items : #IList<'T>) : 'T[] = failwith "not implemented"

F# 3.1 支持使用 C# 样式扩展方法Extension(定义和使用),因此这可能是另一种选择,但这意味着依赖 F# 的新版本(但如果有另一种编写方式,这可能还不错使用可在 F# 3.0 中工作的模块函数)

于 2013-10-22T15:55:30.600 回答