从F#互动,为什么不接受这个?

时间:2010-02-03 16:22:26

标签: f# functional-programming

我正在使用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中输入了以下四个问题:

  1. 为什么会收到如图1所示的错误消息。
  2. 为什么=member x.Print()旁边有x.ToString()member x.Data没有?
  3. x来自哪里?为什么在定义MyCell类型时会出现这种情况,那么如何以这种方式引用“对象”,例如x.Print()x.ToString()x.Data
  4. > 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。

    谢谢, 最好的祝福, 汤姆。

3 个答案:

答案 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)

  1. 正如pblassucci所说,你需要缩进你班级的内容。
  2. PrintToString是方法,但Data是属性,因此对于Data=位于get的定义之前}和set方法。
  3. F#允许您逐个成员地选择标识符,而不是始终使用this之类的标识符来引用其成员正在定义的类。许多示例中使用了x,但选择是任意的。

答案 2 :(得分:3)

更简单,只需缩进你的班级身体......

> type MyCell(n:int) =
-     let mutable data = n + 1
...