构造函数中的F#引号、数组和自标识符
我认为这是众所周知的F#限制,但我找不到任何好的解决办法 下面是代码(我试着让它尽可能简单,所以看起来可能没有任何意义): 用构造函数中的F#引号、数组和自标识符,f#,websharper,F#,Websharper,我认为这是众所周知的F#限制,但我找不到任何好的解决办法 下面是代码(我试着让它尽可能简单,所以看起来可能没有任何意义): 用作为self我甚至不能定义类常量。实际上,这是一个单独的问题,但我在这里要问:在这种特殊情况下,如何定义类常量 我认为这一点都不愚蠢。为了清晰起见,我们实际上更喜欢静态构造函数方法,即使在不使用WebSharper的代码中也是如此。在整个IntelliFactory代码库中,我们很少使用self 您遇到了F#编译器和引号的两个恼人的限制。正如您所指出的,静态方法可以解决s
作为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
[]
注释将允许您在常量上进行模式匹配,如果有多个常量,这将非常方便
关于你的观点:
静态构造函数——很好。说到第二个例子,好吧,模块常量确实有效,但我认为这实际上是一个类常量,这就是为什么我想在类中加入它。在类中拥有类常量(并且不污染模块名称空间)似乎是一件合理的事情。
[<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)