gpt4 book ai didi

c# - Nullable 可以用作 C# 中的仿函数吗?

转载 作者:可可西里 更新时间:2023-11-01 07:51:43 25 4
gpt4 key购买 nike

考虑以下 C# 代码。

public int Foo(int a)
{
// ...
}

// in some other method

int? x = 0;

x = Foo(x);

最后一行会返回一个编译错误 cannot convert from 'int?'到 'int' 这很公平。但是,例如在 Haskell 中有 Maybe,它对应于 C# 中的 Nullable。因为 Maybe 是一个 Functor,所以我可以使用 fmapFoo 应用于 x >。 C#有没有类似的机制?

最佳答案

我们可以自己实现这样的功能:

public static class FuncUtils {

public static Nullable<R> Fmap<T, R>(this Nullable<T> x, Func<T, R> f)
where T : struct
where R : struct {
if(x != null) {
return f(x.Value);
} else {
return null;
}
}

}

然后我们可以使用它:

int? x = 0;
x = x.Fmap(Foo);

因此它将调用函数 Foo如果x不是 null .它将结果包装回 Nullable<R> .万一xnull , 它将返回 Nullable<R>null .

或者我们可以编写一个更等效的函数(如 Haskell 中的 fmap),其中我们有一个函数 Fmap。将 Func<T, R> 作为输入并返回 Func<Nullable<T>, Nullable<R>>这样我们就可以将它用于某个x :

public static class FuncUtils {

public static Func<Nullable<T>, Nullable<R>> Fmap<T, R>(Func<T, R> f)
where T : struct
where R : struct {
return delegate (Nullable<T> x) {
if(x != null) {
return f(x.Value);
} else {
return null;
}
};
}

}

然后我们可以像这样使用它:

var fmapf = FuncUtils.Fmap<int, int>(Foo);
fmapf(null); // -> null
fmapf(12); // -> Foo(12) as int?

关于c# - Nullable 可以用作 C# 中的仿函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488178/

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