构造函数中的F#引号、数组和自标识符

构造函数中的F#引号、数组和自标识符,f#,websharper,F#,Websharper,我认为这是众所周知的F#限制,但我找不到任何好的解决办法 下面是代码(我试着让它尽可能简单,所以看起来可能没有任何意义): 用作为self我甚至不能定义类常量。实际上,这是一个单独的问题,但我在这里要问:在这种特殊情况下,如何定义类常量 我认为这一点都不愚蠢。为了清晰起见,我们实际上更喜欢静态构造函数方法,即使在不使用WebSharper的代码中也是如此。在整个IntelliFactory代码库中,我们很少使用self 您遇到了F#编译器和引号的两个恼人的限制。正如您所指出的,静态方法可以解决s

我认为这是众所周知的F#限制,但我找不到任何好的解决办法

下面是代码(我试着让它尽可能简单,所以看起来可能没有任何意义):

作为self
我甚至不能定义类常量。实际上,这是一个单独的问题,但我在这里要问:在这种特殊情况下,如何定义类常量



我认为这一点都不愚蠢。为了清晰起见,我们实际上更喜欢静态构造函数方法,即使在不使用WebSharper的代码中也是如此。在整个IntelliFactory代码库中,我们很少使用
self

您遇到了F#编译器和引号的两个恼人的限制。正如您所指出的,静态方法可以解决
self
问题:

[<ReflectedDefinition>]
type Human private (cats: ref<Cat []>) =
    member this.Cats = !cats

    static member Create(makeAName: unit -> string) =
        let cats = ref [| |]
        let h = Human(cats)
        let cat = Cat(h, makeAName())
        cats := [| cat |]
        h

and [<ReflectedDefinition>] Cat (owner: Human, name: string) =
    class
    end
[]
注释将允许您在常量上进行模式匹配,如果有多个常量,这将非常方便

关于你的观点:

  • 我真的很想使用数组-应该可以
  • 我真的需要一个自标识符——它从来都不是必需的,就像构造函数不是必需的一样
  • 我真的需要课程(即功能性风格不起作用)-绝对不是真的
  • 每个方法的自标识符(member this.Foo)工作得很好-是的,非常有用

  • 静态构造函数——很好。说到第二个例子,好吧,模块常量确实有效,但我认为这实际上是一个类常量,这就是为什么我想在类中加入它。在类中拥有类常量(并且不污染模块名称空间)似乎是一件合理的事情。
    [<ReflectedDefinition>]
    type User (uid: int) as self =
        let ROOT_UID = 0
        member this.isRoot = (uid = ROOT_UID)
    
    [<ReflectedDefinition>]
    type Human private (cats: ref<Cat []>) =
        member this.Cats = !cats
    
        static member Create(makeAName: unit -> string) =
            let cats = ref [| |]
            let h = Human(cats)
            let cat = Cat(h, makeAName())
            cats := [| cat |]
            h
    
    and [<ReflectedDefinition>] Cat (owner: Human, name: string) =
        class
        end
    
    [<ReflectedDefinition>]
    module Users =
    
        [<Literal>]     
        let ROOT_UID = 0
    
        type User(uid: int) =
            member this.isRoot = (uid = ROOT_UID)