WPF 控件有许多事件成员,它们具有相同的名称,但不共享相同的接口或基类。F# 的类型约束支持编写函数,该函数适用于具有相同成员的所有对象。然后,如果我可以为事件成员编写类型约束,我可以编写 curried 函数,以方便许多控件的属性设置。
open System.Windows.Controls
let inline click handler control =
(^T:(member Click:IEvent<_,_>)control)
.Add handler
Button()
|> click (fun _ -> ()) // error!
MenuItem()
|> click (fun _ -> ()) // error!
type A () =
[<CLIEvent>]
member __.Click = Event<_>().Publish
A() |> click (fun _ -> ()) // It works! but IntelliSense shows the member as "event A.Click .."
但是上面的代码不起作用..我想为事件成员编写类型约束是不可能的..因为这是一个小问题,如果我们通过语言特性解决每一个小问题,语言将变得如此复杂以至于没有人可以使用!(现在 F# 似乎强大而简单)
然后我想知道一些解决这个问题的替代方法,如果它存在的话。