繁体   English   中英

了解类型类,Scala隐式和C#

[英]Understanding Type Classes, Scala implicit and C#

我读了Joe Duffy撰写的有关Haskell类型类和C#接口的博客文章。

我试图了解什么可以使c#具有类型类,并且我想知道像scala的隐式函数这样的功能是否可以解决它?

具有这种功能可以编写如下代码:

public interface IReducableOf<T>
{
   T Append(T a, T b);
   T Empty();
}

public T Reduce(this IEnumerable<T> vals, **implicit** IReducerOf<T> reducer )
{
  Enumerable.Aggregate(vals, reducer.Append);
}

确保在我们的上下文中具有IReducerOf<T>的实现, IReducerOf<T>不是编译器可以“仅”选择reducer并使用它执行代码。

当然,此代码无法编译。

但是我的问题是:

  1. 这样可以实现类型类吗?

  2. 这类似于Scala中发生的事情吗?

我问这个问题是为了获得一般的理解,而不是特定的问题。

更新

我在C#中可能遇到的有关类型类的实现中遇到了这个GitHub存储库

是的,这正是在Scala中实现类型类的方式。 Scala的一般设计原则是在语言中添加通用的和可重用的功能,如果可能的话,这些功能可用于将高级构造作为库构造实现。 在这种特殊情况下,可以使用对象和隐式对象来实现类型类,但是对象和隐式对象不仅具有实现类型类的用途,因此在语言中包含那些更通用的构建块并允许用户构建更高的类更有意义。级别的构造(如类型类)放在顶部。

关于将类型类实现为对象和隐式的规范性论文是Bruno C. d恰当地命名为对象和隐式类型类 S. Oliveira,Adriaan Moors和Martin Odersky 关于Lambda-the-Ultimate的文章有很好的讨论

请注意,仅向语言添加隐式内容可能还不够。 您可以通过这种方式实现类型类,但是在C♯中无法表达很多“有趣的”类型类(例如Monad ): Monad具有更高的种类,而C♯的类型系统则不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM