代码之家  ›  专栏  ›  技术社区  ›  UserControl

为什么在即将到来的版本中没有像IMonad<T>这样的东西。网络4.0

  •  29
  • UserControl  · 技术社区  · 16 年前

    interface IMonad<T>
    {
     SelectMany/Bind();
     Return/Unit();
    }
    

    2 回复  |  直到 16 年前
        1
  •  62
  •   Max Strini    16 年前

    想想签名是用来干什么的 IMonad<T> 的方法必须是。在Haskell中,Monad类型类定义为

    class Monad m where
      (>>=) :: m a -> (a -> m b) -> m b
      return :: a -> m a
    

    将其直接转换为C#接口很棘手,因为您需要能够引用特定的实现子类型(“ma”或 ISpecificMonad<a> )在通用IMonad接口的定义范围内。好吧,而不是试图拥有(例如) IEnumerable<T> 实施 IMonad<T> 直接地,我们将尝试将IMonad实现分解为一个单独的对象,该对象可以与特定的monad类型实例一起传递给需要将其视为monad的任何对象(这是“字典传递风格”)。这将是 IMonad<TMonad> IEnumerable<T> 但是 IEnumerable<T> Return<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点之外,“正确”实现这一点不仅需要添加另一个普通的接口定义,还需要对类型系统进行深度添加。

    这就是为什么对自己的类型进行查询理解的能力被黑客攻击了(如果存在具有正确签名的正确魔术方法名称,它们就会“神奇地”工作),而不是使用接口机制等。

        2
  •  -20
  •   Jonathan Allen    16 年前

    事实上,我甚至会说单子是完全无用的。NET开发人员。每次我看到图书馆。基于monads的.NET,它总是比直接的C#或VB代码更冗长,更难理解。原因很简单,像C#和VB这样的语言建立在比Haskell这样的语言强大得多的构建块之上。

    Haskell尤其需要对所有事情都使用monad,因为这就是它们所拥有的一切。Lisp中的宏或JavaScript中的动态类型也是如此。当你有一匹只有一个技巧的小马时,这个技巧必须非常好。

    On LINQ, Monads, and the Blindness of Power

    推荐文章