以下是代码:
type Advertisement() =
member val Photos = seq<images> with get,set
但是这会返回属性Photos的函数签名
seq<images> -> seq<images>
我只想让属性代表一系列图像
seq<images>
我错过了什么?
答案 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>
。