Другие языки программирования, которые поддерживают implicits "a la Scala",
Scala implicits очень мощные. Мне любопытно, являются ли они новой/уникальной функцией Scala, или концепция уже существует на других языках программирования.
Спасибо.
ИЗМЕНИТЬ
Чтобы прояснить мой вопрос, да, я говорю об этой конкретной реализации. Сначала "косвенные вещи" казались странными, но, использовав их некоторое время и видя, как другие используют его, я впечатлен тем, насколько хорошо он работает.
Ответы
Ответ 1
Похоже, что вдохновением стали классы типа Haskell. По крайней мере, одна статья в блоге утверждает, что implicits имеют свое происхождение в классах типа Haskell; в статье упоминается статья Мартина Одерского от 2006 года под заголовком Классы классов бедного человека. Даниэль Собрал написал недавнюю статью о том, как имитировать классы типов с implicits.
Ответ 2
В 2000 году была хорошая статья в "Принцессах программирования Lanages" (POPL), в которой были введены неявные параметры. Они были реализованы в Haskell. Я уверен, что Мартин Одерски, разработчик Scala, знал об этой работе. (Мартин является частым и приветствуемым участником и участником POPL.)
Ответ 3
Еще одна ссылка: "Тип классов как объекты и имплициты" (2010), Bruno C. d. С. Оливейра, Адриан Маорс и Мартин Одерски.
Через это твит и re-tweet.
Ответ 4
Это зависит от того, насколько широко вы хотите растянуть фразу "поддерживает implicits". Одной из убедительных причин неявки в Scala является существенное добавление методов к существующему классу (к которому у вас нет доступа). Это возможно на других языках через различные конструкции: например, Smalltalk, Ruby и Objective-C все поддерживают методы добавления к классам, которые вы не контролируете.
Ответ 5
Если я правильно понимаю implicits из http://patricklogan.blogspot.com/2007/06/scala-implicits.html, тогда да, есть несколько языков, которые его поддерживают.
Лучший пример - методы расширения С#. Недавний пример, когда я использовал их:
Мне часто приходилось делать вычисления расстояний между двумя Point
s. A 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);
Ответ 6
Хотя не так сильно, как Scala implicits, на С++ уже были операторы преобразования и конструкторы копирования, которые могли бы привести к неявным преобразованиям типов. В сочетании с возможностью определять бинарные операторы (что-то Scala не позволяет) это обеспечило некоторую мощность Scala implicits.