.net - 是否可以为 .NET 编写仿函数接口(interface)?

标签 .net functional-programming

函数式语言通常有 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/

相关文章:

C# 需要访问 Microsoft Management Infrastructure 命名空间

c# - 匹配进程参数的正则表达式

variables - 我如何记住 Haskell 中二叉搜索树的根

r - R 中的循环效率低下

javascript - 从for()移到map()-无法绕开它

.net - 从 .Net 中的字典对象获取唯一的配对

c# - 小数加倍

c# - 用于列出从 .NET 代码访问数据库的工具

haskell - 在 Haskell 中对列表列表进行排序

flutter - 当小部件从窗口中删除时,不会调用 Dispose - Flutter