Другие языки программирования, которые поддерживают имплициты "а-ля Скала" - PullRequest
18 голосов
/ 18 июня 2010

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

Спасибо.

EDIT :

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

Ответы [ 6 ]

14 голосов
/ 18 июня 2010

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

5 голосов
/ 18 июня 2010

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

2 голосов
/ 22 июня 2010

Другая ссылка: "Классы типов как объекты и следствия" (2010), Бруно С. d.S. Oliveira, Adriaan Moors и Martin Odersky.

Через этот твит и повторный твит .

1 голос
/ 18 июня 2010

Хотя это и не так эффективно, как это делает Scala, в C ++ уже есть операторы преобразования и конструкторы копирования, которые могут привести к неявным преобразованиям типов.В сочетании со способностью определять бинарные операторы (что Scala не позволяет) это дало некоторые возможности Scala.

1 голос
/ 18 июня 2010

Если я правильно понимаю последствия из 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);
1 голос
/ 18 июня 2010

Это зависит от того, насколько широко вы хотите растянуть фразу «поддерживает последствия».Одна из неотразимых причин для включения в Scala заключается в существенном добавлении методов в существующий класс (к которому у вас нет доступа).Это возможно в других языках с помощью различных конструкций: например, Smalltalk, Ruby и Objective-C все поддерживают добавление методов в классы, которые вы не контролируете.

...