gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:51:17 27 4
gpt4 key购买 nike

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

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

[<ReflectedDefinition>]
type Human (makeAName: unit -> string) as self =
let mutable cats : Cat array = [| |]
do
// get a cat
cats <- Array.append cats [| new Cat (self, makeAName ()) |]
member this.Cats = cats
and
[<ReflectedDefinition>]
Cat (owner : Human, name : string) = class end

编译器说:

error FS0452: Quotations cannot contain inline assembly code or pattern matching on arrays



实际上是 as self的组合和破坏一切的数组属性 setter/getter 。

这里的要点是:
  • 我真的很想使用数组,因为我希望 WebSharper 将我的集合转换为 JavaSript 数组。
  • 我真的需要构造函数中的自我标识符。
  • 我真的需要类(即功能样式不起作用)。
  • 每个方法的自我标识符( member this.Foo )工作正常。

  • 我能想到的一种解决方法是将构造函数设为私有(private)并使用静态方法来构造对象。这样我就不需要 as self .但这只是愚蠢的。

    有没有更好的选择?

    更新:

    这是一个更简单的例子:
    [<ReflectedDefinition>]
    type User (uid: int) as self =
    let ROOT_UID = 0
    member this.isRoot = (uid = ROOT_UID)

    as 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

    还有很多其他方法可以做到这一点,例如你可以摆脱 ref间接性。

    二、你经常得到 FS0452ReflectedDefinition带有数组操作的代码,即使在普通的静态方法中也是如此。这通常可以通过使用库函数而不是直接数组访问来解决( Array.iterArray.map )。

    对于第二个例子,你真的想要这个:
    [<ReflectedDefinition>]
    module Users =

    [<Literal>]
    let ROOT_UID = 0

    type User(uid: int) =
    member this.isRoot = (uid = ROOT_UID)
    [<Literal>]注释将让您对常量进行模式匹配,如果有多个常量,这会很方便。

    对于您的积分:
  • 我真的很想使用数组——应该没问题
  • 我真的需要一个自我标识符——它从来没有必要,就像构造函数不是
  • 我真的需要类(class)(即功能样式不起作用)-绝对不是
  • 每个方法的自标识符(成员 this.Foo)工作正常 - 是的,并且很有用
  • 关于构造函数中的 F# 引号、数组和自标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677190/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com