2010-06-18 35 views
17

Scala蘊涵是非常強大的。我很好奇它們是否是Scala的新特性,或者這個概念在其他編程語言中已經存在。其他支持蘊含「a la Scala」的編程語言

謝謝。

編輯

爲了澄清我的問題,是的,我說的這個具體實施。一開始就有「隱含的東西」似乎很奇怪,但已經使用了一段時間,看到別人如何使用它,我對它的工作效果印象深刻。

+0

我想你應該區分隱式方法和隱式值。我猜這種語言很可能只支持其中的一種。當然,這兩者都爲進一步的可能性打開了大門,就像已經提到的「模擬類型」解決方案一樣,它實際上是它們的巧妙組合。 – 2010-06-18 12:56:57

+0

我使用* implicits *這個詞來指代隱式轉換和隱式值/參數。我認爲這是斯卡拉語境中的「正常」解釋,但也許我錯了。 – gerferra 2010-06-18 14:02:07

+0

@丹尼爾非常感謝!我編輯了刪除註釋和消息的問題。再次感謝。 – gerferra 2010-06-18 14:15:59

回答

14

貌似靈感來自於Haskell的類型類。至少有一篇博客文章稱implicits have their origin in Haskell type classes;該文章引用Martin Odersky於2006年發表的題爲Poor Man's Type Classes的論文。 Daniel Sobral寫了一篇關於如何simulate type classes with implicits的文章。

+0

事實上,讓我印象更深刻的事情之一是在Ordering和Numeric中使用的類型類事物。感謝您的參考! – gerferra 2010-06-18 13:44:54

+6

雖然含義比類型類更普遍。例如,您總是可以選擇顯式傳遞一個隱式參數,而不是讓編譯器爲您填充它。而在Haskell中,類型類總是由編譯器完成的。 – 2010-06-22 18:10:56

1

這取決於您希望展開「支持隱含」這個短語的廣泛程度。在Scala中隱含的一個令人信服的原因是從本質上將方法添加到現有類(您無法訪問)。在其他語言中,這可以通過不同的構造來實現:例如,Smalltalk,Ruby和Objective-C都支持向不控制的類中添加方法。

1

如果我從http://patricklogan.blogspot.com/2007/06/scala-implicits.html正確理解隱含,那麼是的,有幾種語言支持它。

最好的例子是C#擴展方法。我最近使用它們的一個例子:

我經常需要做兩個Point之間的距離計算。一個Point有沒有一種方法來計算到另一點的距離,所以我下面的代碼添加到我的項目:

class MyPointExtension 
{ 
    public static Double GetDistance(this Point p1, Point p2) 
    { 
    return /* the pythagoras code */ 
    } 
} 

然後我可以這樣做:

Point unitPosition = new Point(x,y); 
Point target = new Point(x2,y2); 
Double distance = unitPosition.GetDistance(target); 
+8

斯卡拉含義比C#擴展方法更強大。用Odersky的話來說*「[在C#中]你只能添加方法,而不是字段或接口到類」*。看到這裏http://www.artima.com/weblogs/viewpost.jsp?thread=179766 – gerferra 2010-06-18 13:30:10

+5

我同意@ german1981,擴展方法是Scala implicits的用法之一,但它本身沒有任何implicits的機制。 – 2010-06-18 14:04:36

1

雖然沒有Scala那麼強大,但C++已經有了轉換運算符和複製構造函數,可能會導致隱式類型轉換。結合定義二元運算符(Scala不允許的東西)的能力,這提供了Scala蘊含的一些權力。

5

2000年編程語言程序(POPL)有一篇非常好的論文,其中介紹了implicit parameters。他們已經在Haskell中實現。我確信斯卡拉的設計師Martin Odersky意識到這項工作。 (Martin是POPL的常客和歡迎參與者和貢獻者)。