gpt4 book ai didi

generics - 类型成员的包装

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

我一直在尝试实现一个调用类型成员的通用函数。我发现通过使用内联应该可以实现这一点。它没有帮助,所以我尝试实现一个接口(interface),如下所示:

type Wrappable<'a, 'b> =
interface
abstract Wrap : ('b -> 'b) -> 'a
end

type StateType =
State of Scene * Cash | Exit
interface Wrappable<StateType, Scene * Cash> with
member this.Wrap f =
match this with
| Exit -> Exit
| State (scene, cash) -> f (scene, cash) |> State

let inline wrap f (o:Wrappable<_, _>) = o.Wrap f

这非常有效,给出了类型输出

type Wrappable<'a,'b> =
interface
abstract member Wrap : ('b -> 'b) -> 'a
end
type StateType =
| State of Scene * Cash
| Exit
with
interface Wrappable<StateType,(Scene * Cash)>
end
val inline wrap : f:('a -> 'a) -> o:Wrappable<'b,'a> -> 'b

不过,我发现这种方式非常丑陋。我的问题是:是否有更好的方法将成员包装在函数中?

最佳答案

这就是您可以使用statically resolved type parameters来做到这一点的方法我提到:

type StateType =
State of int * string | Exit
member this.Wrap f =
match this with
| Exit -> Exit
| State (scene, cash) -> f (scene, cash) |> State

let inline wrap f (o : ^a) = (^a : (member Wrap : (^b -> ^b) -> ^a) (o, f))

我使用 int * string 因为我不知道您的 SceneCash 并且想测试它:

> let x = State (5,"Hallo");;

val x : StateType = State (5,"Hallo")

> let f (x,y) = (x+x,y);;

val f : x:int * y:'a -> int * 'a

> wrap f x;;

val it : StateType = State (10,"Hallo")

关于generics - 类型成员的包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761153/

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