Scala implicits очень мощен. Мне любопытно, если они - новая / уникальная функция Scala, или понятие уже существовало на других языках программирования.
Спасибо.
Править:
Для разъяснения моего вопроса, да, я говорю об этой конкретной реализации. При наличии "неявных вещей" все вокруг казавшегося, странного сначала, но использовавший его некоторое время и наблюдении, как другие используют его, я впечатлен тем, как хорошо это работает.
Похоже, что источником вдохновения послужили классы типов в Haskell. По крайней мере, в одной из статей блога утверждается, что имплициты берут свое начало в классах типов Haskell; статья ссылается на статью Мартина Одерски 2006 года под названием Poor Man's Type Classes. А Дэниел Собрал написал недавнюю статью о том, как моделировать классы типов с имплицитами.
Если я правильно понял имплициты из http://patricklogan.blogspot.com/2007/06/scala-implicits.html, то да, есть несколько языков, которые поддерживают это.
Лучший пример - методы расширения C#. Недавний пример, где я их использовал:
Мне часто приходилось вычислять расстояние между двумя точками
. У 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);
Хотя имплициты в Scala не такие мощные, как в C++ уже были операторы преобразования и конструкторы копирования, которые могли приводить к неявным преобразованиям типов. В сочетании с возможностью определять бинарные операторы (то, что Scala не позволяет) это обеспечивало некоторую мощь имплицитов Scala.
Это зависит от того, насколько широко вы хотите растянуть фразу "поддерживает имплициты". Одна из убедительных причин для имплицитов в Scala - это добавление методов в существующий класс (к которому у вас нет доступа). Это возможно в других языках с помощью различных конструкций: например, Smalltalk, Ruby и Objective-C поддерживают добавление методов в классы, которые вы не контролируете.
На сайте Princples of Programming Lanages (POPL) в 2000 году была действительно хорошая статья, в которой были представлены неявные параметры . Они реализованы на Haskell. Я уверен, что Мартин Одерски, дизайнер Scala, знал об этой работе. (Мартин - частый и желанный участник и участник POPL.)
Еще одна ссылка: "Type Classes as Objects and Implicits" (2010), авторы Bruno C. d. S. Oliveira, Adriaan Moors и Martin Odersky.