gpt4 book ai didi

generics - F# ICastableTo<'T> 等效吗?

转载 作者:行者123 更新时间:2023-12-02 19:21:16 25 4
gpt4 key购买 nike

您无法在 F# 中实现通用接口(interface)的多个实例。就我而言,这是一个无赖,因为我计划实现一个名为 ICastableTo<'T> 的接口(interface),该接口(interface)可用于模式匹配:

type ICastableTo<'T> =
/// <summary>
/// Returns a casted version of the object
/// </summary>
member this.Value : 'T

...
(*x:obj*)
match x with
| :? ICastableTo<SomeType> as x -> doSomethingWith(x.Value)
| _ -> invalidOp("can't cast like that")

但是,当我尝试实际使用它时,我遇到了一个问题,因为我无法实现 ICastableTo 接口(interface)的多个版本(请参阅 Implementing the same interface at different generic instantiations ),但我的一些类实际上可以转换为不止一种类型。

我最好的选择是什么?我当然可以定义一个 ICastable 接口(interface)并使用一个“PossibleCasts”属性来公开所有可用的转换委托(delegate),但这不是非常漂亮,并且不能很好地继承继承。

<小时/>

这是我的代码:

type BindableFunction<'T,'V>(func : 'T -> 'V) =
member val Parent : 'T = nothing with get, set
interface Specializable with
member SpecializeFor(x: obj) =
match x with | :? ICastable<'T> as x -> Parent <- x.Value | _ -> invalidOp("")

然后我就有了我的浇注料类(class)。例如,我有一个 TCell 类,它具有对 Cell(组合)的引用,因此可以出于函数绑定(bind)的目的将其转换为 Cell,即使这两种类型之间没有继承链接。

我认为我最终要做的是生成非通用的“match x with | ICastable<'T>”(又名,我将使用 ICastableOf_Cell 并使用 Reflection 找到好的接口(interface)(按名称获取类型) ),然后使用 Reflection.Emit 生成代码。

另一种选择是为 BindableFunction 提供两种泛型类型,一种是值类型,另一种是 ICastableOf_Cell,这可能是一个更好的主意,但会使我的代码在各个地方更加冗长。

最佳答案

最后,我采用了以下方法:

type BindableFunction<'T,'V>(convert: obj -> 'T, func : 'T -> 'V) =
member val Parent : 'T = nothing with get, set
interface Specializable with
member SpecializeFor(x: obj) =
match x with
| :? 'T as x -> (Parent <- x)
| _ -> (Parent <- convert(x))

这允许我为每种类型使用独特的接口(interface),因此不使用通用接口(interface)。

let CastToCell = ref(fun(o:obj) -> match o with | :? ICellScope as o -> o.ICell.Cell | _ -> invalidOp("invalid scope conversion"))

最终:

new BindableFunction<Cell,_>(!CastToCell,...)

关于generics - F# ICastableTo<'T> 等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20973218/

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