これは F# のよく知られた制限だと思いますが、適切な回避策が見つかりませんでした…</p>
コードは次のとおりです (できるだけ単純にしようとしたので、おそらく意味がないように見えます)。
[<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
コンパイラは次のように述べています。
エラー FS0452: 引用符にインライン アセンブリ コードまたは配列のパターン マッチングを含めることはできません
実際、as self
すべてを破壊するのは と 配列プロパティ ゲッターの組み合わせです。
ここでのポイントは次のとおりです。
- WebSharper にコレクションを JavaSript 配列に変換してもらいたいので、本当に配列を使いたいと思っています。
- コンストラクターには自己識別子が本当に必要です。
- 私は本当にクラスが必要です (つまり、機能的なスタイルは機能しません)。
- メソッドごとの自己識別子 (
member this.Foo
) は正常に機能します。
私が考えることができる 1 つの回避策は、コンストラクターを非公開にし、静的メソッドを使用してオブジェクトを構築することです。このように私は必要ありませんas self
。しかし、それはばかげています。
より良いオプションはありますか?
アップデート:
さらに簡単な例を次に示します。
[<ReflectedDefinition>]
type User (uid: int) as self =
let ROOT_UID = 0
member this.isRoot = (uid = ROOT_UID)
クラス定数を定義することas self
さえできません。それは実際には別の質問ですが、ここで質問します: この特定のケースでクラス定数を定義するにはどうすればよいですか?