gpt4 book ai didi

f# - 你如何定义这个静态解析的类型参数?

转载 作者:行者123 更新时间:2023-12-01 22:59:43 25 4
gpt4 key购买 nike

给定

open System
open System.Windows
open System.Windows.Input
open System.ComponentModel

type RelayCommand (canExecute:(obj -> bool), action:(obj -> unit)) =
let event = new DelegateEvent<EventHandler>()
interface ICommand with
[<CLIEvent>]
member x.CanExecuteChanged = event.Publish
member x.CanExecute arg = canExecute(arg)
member x.Execute arg = action(arg)
member x.CheckCanExecute (sender:obj) (eventArgs:EventArgs) = event.Trigger([| sender;eventArgs |])

如何编写一个静态解析的类型参数化函数来满足对 CheckCanExecute 的调用?

虽然这个函数有效,但它并不能帮助我学习静态解析的类型参数语法
let checkCanExecute (c:RelayCommand) = c.CheckCanExecute (box this) (EventArgs())
我希望这行得通
let checkCanExecute (e:^a) = (^a: (member CheckCanExecute: sender:obj -> EventArgs -> unit ) (e, (box me),(EventArgs())))
但在调用现场 checkCanExecute addCommand
我找不到方法或对象构造函数“CheckCanExecute”(使用第二个定义时,第一个编译得很好)

我如何定义一个类 let使用 Statically Resolved Type Parameters 的绑定(bind)(或成员绑定(bind),如果这是完成工作的更好方法)能够在具有匹配方法签名的任何东西上调用该方法?

最佳答案

我认为这里的一些困难是由 CheckCanExecute 造成的。被定义为柯里化(Currying)函数。对于成员来说,使用元组函数可能会更好(柯里化(Currying)函数的编译方式很棘手,并且可能会混淆静态解析的约束)。

如果您更改 RelayCommand成员如下:

 member x.CheckCanExecute (sender:obj, eventArgs:EventArgs) =  
event.Trigger([| sender;eventArgs |])

让你的 checkCanExecute一个 inline需要元组函数的函数:
let inline checkCanExecute (e:^a) = 
(^a: (member CheckCanExecute: obj * EventArgs -> unit ) (e, box me,(EventArgs())))

然后进行以下类型检查:
checkCanExecute me

关于f# - 你如何定义这个静态解析的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37680758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com