使用sequence属性创建一个F#类

时间:2016-09-14 09:00:18

标签: f#

以下是代码:

type Advertisement() =
    member val Photos = seq<images> with get,set

但是这会返回属性Photos的函数签名

seq<images> -> seq<images>

我只想让属性代表一系列图像

seq<images>

我错过了什么?

2 个答案:

答案 0 :(得分:5)

此处的问题是您希望将seq<images>用作类型注释,但您将其用作表达式。这些有不同的含义;此外,还不清楚您要将哪个序列分配给Photos

例如,如果您要将Photos初始化为空序列,则可以使用Seq.empty并将seq<images>作为类型注释:

    member val Photos = Seq.empty : seq<images> with get, set

或者,正如ildjarn建议的那样,使用Seq.empty<'T>的显式类型参数:

    member val Photos = Seq.empty<images> with get, set

如果Photos的类型在同一代码文件中的用法很清楚,编译器将推断出类型,你甚至可以将其缩短为:

    member val Photos = Seq.empty with get, set

为什么原始代码会返回功能?

当您编写seq<images>表达式而不是类型(即不在:之后或作为类型参数)时,编译器将其解析为Operators.seq<'T>,这是你正在获得签名seq<images> -> seq<images>的功能。

seq的实施有点奇怪;它应该表现得像computation expression,但实际上是编译器的特例。它既可以通过你见过的函数转换为seq<'T>,也可以用seq { yield 1 }表示sequence expressions

答案 1 :(得分:3)

seq<images>指的是seq构建器,就像您按以下方式使用的构建器一样

let foo = seq { yield "bar" }

如果你在seq点击 F12 ,你实际上可以看到这个。要实例化空序列,您需要使用Seq.empty<images>