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

use*_*480 5 f#

这是代码:

type Advertisement() =
    member val Photos = seq<images> with get,set
Run Code Online (Sandbox Code Playgroud)

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

seq<images> -> seq<images>
Run Code Online (Sandbox Code Playgroud)

我只想要属性来表示一系列图像

seq<images>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Van*_*oiy 5

这里的问题是你想seq<images>用作类型注释,但你将它用作表达式.这些有不同的含义; 此外,还不清楚你想要分配的序列Photos.

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

    member val Photos = Seq.empty : seq<images> with get, set
Run Code Online (Sandbox Code Playgroud)

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

    member val Photos = Seq.empty<images> with get, set
Run Code Online (Sandbox Code Playgroud)

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

    member val Photos = Seq.empty with get, set
Run Code Online (Sandbox Code Playgroud)

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

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

实施seq有点奇怪; 它应该表现得像计算表达式,但实际上是编译器的特例.它既可用于seq<'T>通过您所见过的函数进行转换,也可用于表示序列表达式,如seq { yield 1 }.