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

时间:2016-09-22 10:55:12

标签: c# scala haskell functional-programming

我通过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>的实现 比编译器“只”选择减速器并用它来执行代码。

当然,这段代码无法编译。

但我的问题是:

  1. 这可以启用实现类型类吗?

  2. 这与scala中发生的情况类似吗?

  3. 我要求这是一般性的理解而不是特定的问题。

    更新

    我在c#

    中遇到了关于类型类可能实现的GitHub repo

1 个答案:

答案 0 :(得分:2)

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

关于将类型类实现为对象和隐含的规范性文章恰当地命名为Type Classes as Objects and Implicits by Bruno C. d. S. Oliveira, Adriaan Moors, and Martin Odersky。有一个很好的discussion of this paper on Lambda-the-Ultimate

请注意,只是在语言中添加含义可能还不够。您可以通过这种方式实现类型类,但很多“有趣的”类型类(例如Monad)不能在C♯中表达:Monad是更高级的,但是C♯的类型系统不是。