4

次の記事を読みました

http://studentguru.gr/b/kron/archive/2012/09/26/c-template-metaprogramming-and-f-type-providers.aspx

これは、F#タイププロバイダーを使用してコンパイル時のフィボナッチ数列を生成する方法を示しています。解決策は記事にありますが、最終的なプログラムは

> cat .\fib.fs
type fib = Playground.StaticFibonacci<100000>
printfn "Fibonacci(100000) has %d digits" fib.Value.Length
> fsc .\fib.fs -o fib.exe -r:.\FibonacciTypeProvider.dll –nologo
> .\fib.exe
Fibonacci(100000) has 20899 digits

これは非常に強力に見えます。INPC(INotifyPropertyChanged)のタイププロバイダーを作成して、代わりに

open System.ComponentModel

type MyObject() =
    let mutable propval = 0.0

    let propertyChanged = Event<_, _>()
    interface INotifyPropertyChanged with
        [<clievent>]
        member x.PropertyChanged = propertyChanged.Publish

    member this.MyProperty
        with get() = propval
        and  set(v) =
            propval <- v
            propertyChanged.Trigger(this, new PropertyChangedEventArgs("MyProperty"))

あなたは書くことができるかもしれません

open System.ComponentModel

type MyObject() =
    let mutable propval = 0.0

    let propertyChanged = Event<_, _>()
    interface INotifyPropertyChanged with
        [<clievent>]
        member x.PropertyChanged = propertyChanged.Publish

    member this.MyProperty : INPCTypeProvider<double>

ですから、私が半日を無駄にする前に、おそらくもっと情報に通じた誰かが私が私の時間を無駄にしていると私に言うかもしれません、そしてこのレベルのメタプログラミングはただ不可能です。

4

1 に答える 1

6

F#タイプのプロバイダーでこれを達成できるとは思いません(ただし、それは素晴らしいことだと思います)。私が考えることができる多くの問題と考えがあります:

  • あなたの例でINPCTypeProvider<double>は、「プロパティ」の表現のようなものを返す必要があります。プロパティは(イベントとは異なり)ファーストクラスの値ではないため、これは不可能です。もしそうなら、タイププロバイダーは必要ありません...

  • タイププロバイダーは既存のタイプでパラメーター化できないため、次のように書くことはできません。

    type MyNotifyObject = ProvideNotifiable<MyObject>
    

    これが可能であれば、ProvideNotifiableタイプを取得し、追加のインターフェイス実装を使用して新しいタイプを構築するプロバイダーである可能性があります。しかし、これは現時点では不可能です。

  • 単純な型のみが必要な場合は、次のようなものを作成できる可能性があります。

    type MyObject = ProvideNotifiable<"MyProperty:int, OtherProperty:string">
    

    これにより、2つのプロパティ(文字列で定義)を持つ型が生成される可能性がありますが、生成された型にこれ以上何も追加することはできません(ただし、生成プロバイダーを使用して実際の型を生成し、そこから継承できる可能性があります...)これはおそらくあなたができる最善のことです。

タイププロバイダーは別としてINotifyPropertyChanged、引用符を使用することでビットの実装を簡素化できます。このF#スニペットは、実装をより安全にする簡単な例を示しています。

于 2012-12-09T13:41:54.173 に答える