19

Scala の暗黙関数は非常に強力です。それらが Scala の新しい/ユニークな機能なのか、それとも他のプログラミング言語に既に存在していた概念なのか、興味があります。

ありがとう。

編集

私の質問を明確にするために、はい、私はこの具体的な実装について話しています。「暗黙的なもの」があちこちにあるのは最初は奇妙に思えましたが、しばらく使ってみて他の人の使い方を見て、うまく機能していることに感銘を受けました。

4

6 に答える 6

14

Looks like the inspiration was Haskell's type classes. At least one blog article claims that implicits have their origin in Haskell type classes; the article refers to a 2006 paper by Martin Odersky entitled, Poor Man's Type Classes. And Daniel Sobral wrote a recent article on how to simulate type classes with implicits.

于 2010-06-18T12:20:56.787 に答える
5

2000 年に Princples of Programming Lanages (POPL) で非常に優れた論文があり、暗黙のパラメーターが導入されました。これらは Haskell で実装されています。Scala の設計者である Martin Odersky は、この作業を認識していたに違いありません。(Martin は、POPL に頻繁に参加し、歓迎されています。)

于 2010-06-18T16:33:04.467 に答える
2

Another reference: "Type Classes as Objects and Implicits" (2010), by Bruno C. d. S. Oliveira, Adriaan Moors and Martin Odersky.

Via this tweet and re-tweet.

于 2010-06-21T20:53:48.610 に答える
1

Scala の暗黙関数ほど強力ではありませんが、C++ には既に変換演算子とコピー コンストラクターがあり、両方とも暗黙的な型変換を行うことができます。二項演算子 (Scala では許可されていないもの) を定義する機能と組み合わせることで、Scala の暗黙の機能の一部が提供されました。

于 2010-06-18T15:07:29.917 に答える
1

「暗黙をサポートする」というフレーズをどれだけ広く拡張したいかによって異なります。Scala での Implicit の説得力のある理由の 1 つは、既存のクラス (アクセス権がないクラス) に本質的にメソッドを追加することです。これは、さまざまな構造を介して他の言語で可能です。たとえば、Smalltalk、Ruby、および Objective-C はすべて、制御しないクラスへのメソッドの追加をサポートしています。

于 2010-06-18T12:16:35.117 に答える
1

http://patricklogan.blogspot.com/2007/06/scala-implicits.htmlから暗黙を正しく理解していれば、はい、それをサポートする言語がいくつかあります。

最良の例は、C# 拡張メソッドです。私がそれらを使用した最近の例:

2 つの 間の距離計算をしなければならないことがよくありましたPoint。APointには別のポイントまでの距離を計算する方法がないため、次のコードをプロジェクトに追加しました:

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);
于 2010-06-18T12:19:36.990 に答える