Подтвердить что ты не робот

Другие языки программирования, которые поддерживают implicits "a la Scala",

Scala implicits очень мощные. Мне любопытно, являются ли они новой/уникальной функцией Scala, или концепция уже существует на других языках программирования.

Спасибо.

ИЗМЕНИТЬ

Чтобы прояснить мой вопрос, да, я говорю об этой конкретной реализации. Сначала "косвенные вещи" казались странными, но, использовав их некоторое время и видя, как другие используют его, я впечатлен тем, насколько хорошо он работает.

4b9b3361

Ответ 1

Похоже, что вдохновением стали классы типа Haskell. По крайней мере, одна статья в блоге утверждает, что implicits имеют свое происхождение в классах типа Haskell; в статье упоминается статья Мартина Одерского от 2006 года под заголовком Классы классов бедного человека. Даниэль Собрал написал недавнюю статью о том, как имитировать классы типов с implicits.

Ответ 2

В 2000 году была хорошая статья в "Принцессах программирования Lanages" (POPL), в которой были введены неявные параметры. Они были реализованы в Haskell. Я уверен, что Мартин Одерски, разработчик Scala, знал об этой работе. (Мартин является частым и приветствуемым участником и участником POPL.)

Ответ 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.