函数式语言通常有 Functor类型/接口(interface)。
在 .NET 中,Functor 接口(interface)是可通过泛型类型 ( T<A>
) 实现的接口(interface),它具有名为 fmap 的函数,该函数将函数从容器类型 ( A
) 转换为不同类型 ( B
)并返回容器类型为 B 的对象。
例如类型 List<A>
将有一个方法 List.fmap。签名类似于:
public List<B> fmap<B>(Func<A,B>);
是否可以创建这样的界面?是否可以做类似的事情?是否有任何包提供这样的接口(interface)并为明显的类提供扩展方法( List<T>
、 Dictionary<A,B>
、 Set<A>
等)?
更新:
我知道 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# 不支持更高类型,因此直接编写此代码会很不幸。
关于.net - 是否可以为 .NET 编写仿函数接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614020/