2016-09-22 86 views
0

我讀了關於Haskell類型類和C#接口的Joe Duffy這篇博文。瞭解類型類,隱含的Scala和C#

我想了解什麼可能會使得C#有型類, 我不知道像Scala的implicits功能是否可以解決這個問題?

具有這種功能將使寫這樣的事情:

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中發生的事情類似嗎?

我在問這個問題,而不是針對特定的問題。

UPDATE

我遇到這個GitHub repo就可能的執行類型的類在C#中

+3

是的。 「隱式」是Scala如何輸入類。主要區別在於'隱式'通過查找範圍值來工作,而類通過獨特實例的全局數據庫工作 –

+0

當您說類時,您指的是haskell的類型類?所以在編譯時,haskell搜索全局實例db以查找匹配的實例?) – barakcaf

+0

這是正確的。 –

回答

2

是的,這正是型類是如何在Scala中實現。如果可能的話,在Scala中通用的設計原則是將一般的和可重用的特性添加到可用於實現更高層次結構的語言中。在這種特殊情況下,可以使用對象和含義來實現類型類,但是對象和含義除了僅僅實現類型類之外都有其用途,因此將更常用的構件塊包含在語言中並允許用戶構建更高級頂級構造(如類型類)。

關於將類型類實現爲對象和含義的規範文件是恰當地命名爲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的類型系統不是。