【问题标题】:f# type providers and INPC metaprogrammingf# 类型提供程序和 INPC 元编程
【发布时间】:2012-12-09 10:20:22
【问题描述】:

我看了下面的文章

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>

所以在我浪费半天时间深入研究之前,也许有更知情的人会告诉我我在浪费时间,而且这种级别的元编程是不可能的。

【问题讨论】:

  • 我不确定我是否理解您希望它的行为方式。类型提供程序可用于在编译时根据您的代码生成类型。在这里生成一个类型对你有什么帮助?

标签: f# inotifypropertychanged type-providers


【解决方案1】:

我不认为你可以使用 F# 类型提供程序来实现这一点(但我可以看到它会很好)。我能想到的问题和想法有很多:

  • 在您的示例中,您的 INPCTypeProvider&lt;double&gt; 必须返回类似于“属性”表示的内容。这是不可能的,因为属性不是一等值(与事件不同)。如果是的话,你就不需要类型提供程序了......

  • 类型提供者不能被现有类型参数化,所以你不能这样写:

    type MyNotifyObject = ProvideNotifiable<MyObject>
    

    如果这是可能的,ProvideNotifiable 可以是一个提供者,它接受一个类型并构建一个带有额外接口实现的新类型。但这目前是不可能的。

  • 如果你只需要简单的类型,你可以创建类似的东西:

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

    这可以生成具有两个属性的类型(在字符串中定义),但是您不能向生成的类型添加更多内容(尽管,您可能能够使用 生成提供程序 生成实际类型并从中继承......)我认为这可能是你能做的最好的。

除了类型提供者之外,您还可以通过使用引号来稍微简化INotifyPropertyChanged 的实现。这个F# snippet gives a simple example 使实现更安全。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多