是否可以为 .NET 编写函子接口?

2023-11-30

函数式语言通常具有Functor类型/接口。

在 .NET 中,Functor 接口是可通过泛型类型实现的接口 (T<A>)有一个名为 fmap 的函数,该函数从容器类型(A) 到不同的类型 (B) 并返回一个容器类型为 B 的对象。

例如一个类型List<A>将有一个方法 List.fmap。签名会是这样的:

public List<B> fmap<B>(Func<A,B>);

是否可以创建这样的接口?是否可以做类似的事情?是否有任何包提供这样的接口并为明显的类提供扩展方法(List<T>, Dictionary<A,B>, Set<A>, ETC。) ?

Update:

我知道 IEnumerable 对象几乎可以做到这一点。主要区别在于 IEnumerable.Select 返回 IEnumerable 而不是实现者的类型。例如,List.Select(A => B) 返回 IEnumerable 而不是 List。这说明了为什么您不能以明显的方式为 .NET 实现 IMappable,但是是否有可以使用的 hack 或额外的类型信息来有效地实现它?


给定类型的困难fmap是它由更高种类的类型变量(容器类型)参数化。因此,除了简单的多态函数之外,map在名单上:

map :: (a -> b) -> List a -> List b

fmap将此概括为适用于任何容器以及任何元素类型:

fmap :: Functor (f :: * -> *) => (a -> b) -> f a -> f b

C# 中的问题是f是一个更高种类的类型变量(它是一个类型函数)。由于 C# 不支持更高类型,因此直接编写此代码会很不幸。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以为 .NET 编写函子接口? 的相关文章

随机推荐