2012-12-09 31 views
4

我閱讀下面的文章F#類型提供者和INPC元編程

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> 

所以深入挖掘這個也許有人更加了解可以告訴我,我浪費了我的時間,這種級別的元編程是不可能的。

+0

我不確定我的理解你是如何表現的。類型提供程序可用於在編譯時根據您的代碼生成類型。如何生成一個類型在這裏幫助你? – svick

回答

6

我不認爲你可以用F#類型提供程序實現這一點(但我可以看到它會很好)。有一些問題和想法,我能想到的:

  • 在你的榜樣,你的INPCTypeProvider<double>還得回去有點像「財產」的表示。這是不可能的,因爲屬性不是一流的值(與事件不同)。如果他們成功了,你就不會需要一個類型的供應商...

  • 類型供應商無法通過現有的類型參數,所以你不能寫說:

    type MyNotifyObject = ProvideNotifiable<MyObject> 
    

    如果這是可能的,ProvideNotifiable可能作爲一個提供者採取一種類型和建立一個新的類型與額外的接口實現。但目前這是不可能的。

  • 如果你只需要簡單的類型,你也許可以創造的東西,如:

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

    這可能會產生與兩個屬性類型(字符串中定義),但你不能添加任何東西更多到生成的類型(儘管您可以使用生成提供程序生成實際類型,並從中繼承...)我認爲這可能是您可以做的最好的選擇。

除了類型提供程序,還可以通過使用引號來簡化INotifyPropertyChanged的實現。該F# snippet gives a simple example,使實施更安全。

+0

感謝您的片段。 f#是否有能力擁有membername參數裝飾器,以便您可以取消代碼引用? – bradgonesurfing

+1

最近有一個github repo已經創建,試圖解決這個問題。 https://github.com/dmitry-a-morozov/fsharp-wpf-mvc-series/wiki/INotifyPropertyChanged-Type-Provider – bradgonesurfing

相關問題