如何在F#中创建一些本地私有函数的记录

时间:2010-12-06 14:00:04

标签: f#

type SQLConn =
    val mutable private connection  : string option

    member this.Connection
        with get() : string   = this.connection.Value
        and  set(v)           = this.connection           <- Some v

    new (connection : string) = {connection = Some connection;}
    new() = SQLConn @"Data Source=D:\Projects\AL\Service\ncFlow\dbase\dbflow.db3; Version=3;Password=432432434324"

我想在那里使用“let x = 5 + 5”或类似的东西,所以如何在我的类型(类)(记录)中使用私有函数,我知道如果我做SQLConn我可以使用它们( ),但后来我不能使用val,我想同时使用:val和let ...

谢谢

3 个答案:

答案 0 :(得分:2)

错误消息解释了问题:

  

错误FS0963:除非使用隐式构造序列,否则不允许在类定义中使用'let'和'do'绑定。您可以通过修改类型声明来包含参数来使用隐式构造序列,例如'type X(args)= ...'。

错误消息表明您将类声明为type SQLConn(connection) =。如果你这样做,你可能应该删除member this.Connection属性,因为你将不再有一个可变字段。

更可能的解决方法是将x声明为val x : int,然后将x = 5 + 5;初始化程序放在构造函数中。

答案 1 :(得分:2)

Tim解释说,您只能使用隐式构造函数语法的本地let绑定。我肯定会遵循这种方法,因为它使F#代码更具可读性。

您是否有任何特殊原因要在代码中使用val?您仍然可以使用隐式构造函数语法来使用它们,但它们必须是可变的并使用变异初始化:

type SQLConn(connection:string) as x = 
  let mutable connection = connection

  // Declare field using 'val' declaration (has to be mutable)
  [<DefaultValue>]
  val mutable a : int 

  // Initialize the value imperatively in constructor
  do x.a <- 10

  member this.Connection 
    with get() = connection and set(v) = connection <- v 

  new() = SQLConn @"Data Source=.." 

据我所知val只需要创建非私有的字段(某些基于代码的工具可能需要这些工具,如ASP.NET,但其他方面并不实用)。 / p>

答案 2 :(得分:1)

以下情况如何?

type SQLConn(conn:string) =
  // could put some other let bindings here... 
  // ex: 'let y = 5 + 5' or whatever
  let mutable conn = conn
  new() = SQLConn(@"some default string")
  member __.Connection 
    with get () = conn and set v = conn <- v