Scala в примерах: различия между версиями

2557 байт добавлено ,  8 лет назад
(→‎Неявные(имплицитные) параметры и преобразования: — правка кода, некорректного в оригинальной статье)
 
= Неявные(имплицитные) параметры и преобразования =
 
Неявные(имплицитные) параметры и преобразования – это мощные инструменты для настройки существующих библиотек и для создания высокоуровневых абстракций. Например, давайте начнем с абстрактного класса полугрупп, который поддерживает операцию сложения.
 
<font size=3><syntaxhighlight lang=Scala>
abstract class SemiGroup[A] {
def add(x: A, y: A): A
}
</syntaxhighlight></font>
 
А вот подкласс <tt>SemiGroup</tt> — класс <tt>Monoid</tt>, который добавляет поле <tt>unit</tt> (единичный элемент):
 
<font size=3><syntaxhighlight lang=Scala>
abstract class Monoid[A] extends SemiGroup[A] {
def unit: A
}
</syntaxhighlight></font>
 
Вот две реализации моноидов:
 
<font size=3><syntaxhighlight lang=Scala>
object stringMonoid extends Monoid[String] {
def add(x: String, y: String): String = x.concat(y)
def unit: String = ""
}
 
object intMonoid extends Monoid[Int] {
def add(x: Int, y: Int): Int = x + y
def unit: Int = 0
}
</syntaxhighlight></font>
 
Метод суммирования, который работает с произвольными моноидами, может быть написан на чистом Scala следующим образом:
 
<font size=3><syntaxhighlight lang=Scala>
def sum[A](xs: List[A])(m: Monoid[A]): A =
if (xs.isEmpty) m.unit
else m.add(xs.head, sum(xs.tail)(m))
</syntaxhighlight></font>
 
Этот метод может быть вызван, например, так:
 
<font size=3><syntaxhighlight lang=Scala>
sum(List("a", "bc", "def"))(stringMonoid)
sum(List(1, 2, 3))(intMonoid)
</syntaxhighlight></font>
 
Все это работает, но выглядит не очень здорово. Проблема в том, что реализации моноида должны быть переданы в код, который их использует. Порой мы можем захотеть, чтобы система могла вычислить нужные аргументы автоматически, аналогично тому, как это делается при выводе типов аргументов. Это то, чего помогают добиться неявные параметры.
 
 
<font size=3>'''Неявные параметры: основы'''</font>
 
В Scala 2 появилось новое ключевое слово '''<tt>implicit</tt>''', оно может быть использовано в начале списка параметров. Синтаксис:
83

правки