F#的类型推断失败给出了一个不清楚的错误
我在F#中有以下ViewModelBase,我正试图通过WPF构建它来学习F#F#的类型推断失败给出了一个不清楚的错误,f#,inotifypropertychanged,type-inference,F#,Inotifypropertychanged,Type Inference,我在F#中有以下ViewModelBase,我正试图通过WPF构建它来学习F# module MVVM open System open System.Collections.ObjectModel open System.ComponentModel open Microsoft.FSharp.Quotations open Microsoft.FSharp.Quotations.Patterns open System.Reactive.Linq module Property =
module MVVM
open System
open System.Collections.ObjectModel
open System.ComponentModel
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
open System.Reactive.Linq
module Property =
let ToName(query : Expr) =
match query with
| PropertyGet(a, b, list) ->
b.Name
| _ -> ""
let SetValue<'t>(obj, query : Expr<'t>, value : 't) =
match query with
| PropertyGet(a, b, list) ->
b.SetValue(obj, value)
| _ -> ()
let GetValue<'o, 't>(obj : 'o , query : Expr<'t>) : option<'t> =
match query with
| PropertyGet(a, b, list) ->
option.Some(b.GetValue(obj) :?> 't )
| _ -> option.None
let Observe<'t>(x: INotifyPropertyChanged) (p : Expr<'t>) =
let name = ToName(p)
x.PropertyChanged.
Where(fun (v:PropertyChangedEventArgs) -> v.PropertyName = name).
Select(fun v -> GetValue(x, p).Value)
type ViewModelBase() =
let propertyChanged = new Event<_, _>()
interface INotifyPropertyChanged with
[<CLIEvent>]
member x.PropertyChanged = propertyChanged.Publish
abstract member OnPropertyChanged: string -> unit
default x.OnPropertyChanged(propertyName : string) =
propertyChanged.Trigger(x, new PropertyChangedEventArgs(propertyName))
member x.SetValue<'t>(expr : Expr<'t>, v : 't) =
Property.SetValue(x, expr, v)
x.OnPropertyChanged(expr)
member x.OnPropertyChanged<'t>(expr : Expr<'t>) =
let propName = Property.ToName(expr)
x.OnPropertyChanged(propName)
但是,编译器没有告诉我什么value prior是问题的关键部分。由于我对F#所使用的类型推断非常陌生,我可能遗漏了一个明显的问题
仅供参考,该代码的用途如下,但目前该代码已被注释掉,错误仅与上述核心代码有关
type TestModel() as this =
inherit MVVM.ViewModelBase()
let mutable name = "hello"
let subscription = (Property.Observe this <@ this.SelectedItem @>).
Subscribe(fun v -> Console.WriteLine "Yo")
member x.SelectedItem
with get() = name
and set(v) =
x.SetValue(<@ x.SelectedItem @>, v)
键入TestModel(),如下所示=
继承MVVM.ViewModelBase()
让可变名称=“你好”
让订阅=(Property.com遵守此规则)。
订阅(fun v->Console.WriteLine“Yo”)
成员x.SelectedItem
使用get()=name
并设置(v)=
x、 设定值(,v)
我找到了
let SetValue<'t>(obj, query : Expr<'t>, value : 't) =
match query with
| PropertyGet(a, b, list) ->
b.SetValue(obj, value)
| _ -> ()
let SetValue,value:'t)=
匹配查询
|属性集(a、b、列表)->
b、 设置值(对象,值)
| _ -> ()
受到限制。应该是
let SetValue<'t>(obj : Object, query : Expr<'t>, value : 't) =
match query with
| PropertyGet(a, b, list) ->
b.SetValue(obj, value)
| _ -> ()
let SetValue,value:'t)=
匹配查询
|属性集(a、b、列表)->
b、 设置值(对象,值)
| _ -> ()
我正在尝试将wiki更新为您的帖子上的标签[inpc],它应该是什么?inpc是InotifyProperty的常见首字母缩略词更改了一个界面,用于通知对象的属性更改,该对象主要用于MVC或MVVM模式的用户界面设计中。这些属性都是模糊的。“我们已经有了一个真实事物的标签。@乔恩,你的评论与问题无关,带有一种居高临下的语气。把答案改成评论并不能真正增加任何价值。@BradGonessurfing好的,我从F#的大祭司那里听说我在这里写的是错的。他称这种风格为“名字安全”。我会尽快查看您的样本。通常需要两天时间,堆栈溢出才会允许您接受自己的答案。
let SetValue<'t>(obj : Object, query : Expr<'t>, value : 't) =
match query with
| PropertyGet(a, b, list) ->
b.SetValue(obj, value)
| _ -> ()