...与所有那些与monad有关的新功能(如果不算IEnumerable,则不是那么新)?interface IMonad<T>{ SelectMany/Bind(); Return/Unit();}这将允许编写可在任何monadic类型上运行的函数。还是不是那么关键? 最佳答案 考虑一下IMonad<T>方法的签名必须是什么。在Haskell中,Monad类型类定义为class Monad m where (>>=) :: m a -> (a -> m b) -> m b return :: a -> m a将其直接转换为C#接口(interface)非常棘手,因为您需要能够在常规IMonad接口(interface)的定义中引用特定的实现子类型(“ma”或ISpecificMonad<a>)。好的,我们将尝试将IMonad实现分解为一个单独的对象,该对象可以与特定的monad类型实例一起传递给需要将其视为对象的任何对象,而不是尝试让IEnumerable<T>直接实现IMonad<T>(例如) monad(这是“传递字典的样式”)。这将是IMonad<TMonad>,而TMonad此处不是IEnumerable<T>中的T,而是IEnumerable<T>本身。但是等等-这也不起作用,因为例如Return<T>的签名必须使我们从任何T类型转换为TMonad<T>,对于任何TMonad<>。 IMonad必须定义为类似interface IMonad<TMonad<>> { TMonad<T> Unit<T>(T x); TMonad<U> SelectMany<T, U>(TMonad<T> x, Func<T, TMonad<U>> f);}使用假设的C#功能,该功能将允许我们将类型构造函数(如TMonad )用作通用类型参数。但是,C#当然不具有此功能(高级多态性)。您可以在运行时(typeof(IEnumerable<>))验证类型构造函数,但在不给它们参数的情况下不能在类型签名中引用它们。因此,除了-100点之外,“适当地”实现该功能不仅需要添加另一个普通的接口(interface)定义,还需要对类型系统进行深层的添加。这就是为什么要对自己的类型进行查询理解的能力(如果存在带有正确签名的正确魔术方法名称的话,它们就会“神奇地”起作用)而不是使用接口(interface)机制等。关于c# - 为什么在即将推出的.NET 4.0中没有像IMonad <T>这样的东西,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1709897/ 10-11 18:21