gpt4 book ai didi

f# - 在 C# 中实现具有 Unit 返回类型的 F# 接口(interface)成员

转载 作者:行者123 更新时间:2023-12-04 18:46:14 24 4
gpt4 key购买 nike

假设我在 F# 中定义了以下接口(interface):

type IFoo<'T> = 
abstract member DoStuff : 'T -> unit

如果我在 C# 中实现它,我需要方法签名为:
public void DoStuff<T>(T arg) {...}

我真正想做的是引用 FSharp.Core 然后使用:
public Unit DoStuff<T>(T arg) {...}

这将简化其他代码,因为我不必处理 Action vs Func。我猜没有任何干净的方法可以实现这一目标?一些邪恶的黑客怎么样?

最佳答案

Unit的改造至void被烘焙到编译器中。有一个 FuncConvert F# Core 中用于在 FSharpFunc 之间转换的类和 Converter .定义一个类似的类来转换怎么样 Action<T>Func<T, Unit> ?

static class ActionConvert {
private static readonly Unit Unit = MakeUnit();

public static Func<T, Unit> ToFunc<T>(Action<T> action) {
return new Func<T, Unit>(x => { action(x); return Unit; });
}

private static Unit MakeUnit() {
//using reflection because ctor is internal
return (Unit)Activator.CreateInstance(typeof(Unit), true);
}
}

然后你可以做

var foo = new Foo<int>();
var func = ActionConvert.ToFunc<int>(foo.DoStuff);

您甚至可以放弃 Unit实例并返回 null反而。

关于f# - 在 C# 中实现具有 Unit 返回类型的 F# 接口(interface)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13928963/

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