[英]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並使用它執行代碼。
當然,此代碼無法編譯。
但是我的問題是:
這樣可以實現類型類嗎?
這類似於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.