我正在使用F#CTP 1.9.7.8并根据Tomas Petricek的文章(第12页)运行示例
type MyCell(n:int) = let mutable data = n + 1 do printf "Creating MyCell(%d)" n member x.Data with get() = data and set(v) = data <- v member x.Print() = printf "Data %d" n override x.ToString() = sprintf "(Data %d)" data static member FromInt(n) = MyCell(n)
我在F#Interactive中输入了以下四个问题:
=
,member x.Print()
旁边有x.ToString()
但member x.Data
没有?x
来自哪里?为什么在定义MyCell
类型时会出现这种情况,那么如何以这种方式引用“对象”,例如x.Print()
,x.ToString()
和x.Data
? > type MyCell(n:int) = - let mutable data = n + 1 type MyCell(n:int) = -----^^^^^^^ stdin(6,6): error FS0547: A type definition requires one or more members or othe r declarations. If you intend to define an empty class, struct or interface, the n use 'type ... = class end', 'interface end' or 'struct end'. -
图1。
谢谢, 最好的祝福, 汤姆。
答案 0 :(得分:4)
看起来像是:
> type MyCell(n:int) =
- let mutable data = n + 1
不尊重缩进。默认情况下,F#是空白敏感的,因此您必须保留任何缩进。请尝试改为:
> type MyCell(n:int) =
- let mutable data = n + 1
- // etc.
(您可以通过在文件顶部添加#light“off”来使F#非空白敏感,然后根据danben的回答,您需要使用额外的关键字。)
答案 1 :(得分:4)
Print
和ToString
是方法,但Data
是属性,因此对于Data
,=
位于get
的定义之前}和set
方法。this
之类的标识符来引用其成员正在定义的类。许多示例中使用了x
,但选择是任意的。答案 2 :(得分:3)
更简单,只需缩进你的班级身体......
> type MyCell(n:int) =
- let mutable data = n + 1
...