Исходя из Java-фона, Scala предоставляет множество приятных функций и библиотек, которые позволяют создавать красивый и лаконичный код. Но обдумывать эти концепции может быть сложно. В этой короткой серии статей я расскажу о некоторых концепциях, лежащих в основе scala, и покажу, как вы можете использовать различные концепции. В этой серии нет строгой структуры, я просто покажу интересные концепции.
Складывание и раскладывание
В этом фрагменте мы рассмотрим сворачивание. Согласно википедии это складывание делает:
«В функциональном программировании сворачивание — также известное по-разному как уменьшение, накопление, агрегирование, сжатие или внедрение — относится к семейству функций более высокого порядка, которые анализируют рекурсивную структуру данных и рекомбинируют посредством использования заданной операции объединения, результаты которых рекурсивно обработка его составных частей, создание возвращаемой стоимости ».
— http://en.wikipedia.org/wiki/Fold_ (функция более высокого порядка)
Таким образом, вы вводите некоторые данные, применяете метод и возвращаете другое значение. Давайте сначала посмотрим на сигнатуру операции сгиба:
1
|
def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 |
Сначала давайте посмотрим на документацию ( http://www.scala-lang.org/api/current/index.html#scala.collection.immuta… )
Складывает элементы этого проходимого или итератора, используя указанный ассоциативный бинарный оператор. Порядок, в котором выполняются операции над элементами, не определен и может быть недетерминированным.
- A1: параметр типа для бинарного оператора, супертип A.
- z: нейтральный элемент для операции сгиба; может добавляться к результату произвольное количество раз и не должно изменять результат (например, Nil для конкатенации списков, 0 для сложения или 1 для умножения).
- op: бинарный оператор, который должен быть ассоциативным, возвращает результат применения оператора сгиба op между всеми элементами и z
У меня всегда возникают трудности с чтением такого рода описаний, чтобы мы могли взглянуть на пример:
1
2
3
4
5
|
scala> val list = "Hello World this is a string" .split( " " ); list: Array[String] = Array(Hello, World, this , is, a, string) scala> list.fold( ">>" ) {(z, i) => z + ":" + i } res3: String = >>:Hello:World: this :is:a:string |
Здесь мы сначала создаем List [String]. На этом объекте мы вызываем метод сгиба. Первый аргумент, который мы предоставляем, является начальным значением, а второй аргумент — это функция, которую мы применяем к каждому значению списка. В этом случае мы просто объединяем значения вместе. Выход этой функции используется как вход для следующей.
Давайте посмотрим на пару других примеров:
Здесь мы суммируем все значения:
1
2
3
4
5
|
scala> val list = List.range( 0 , 20 ) list: List[Int] = List( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 ) scala> list.fold( 0 ){(z, i) => z + i } res10: Int = 190 |
Или продукт их:
1
2
3
4
5
|
scala> val list = List.range( 1 , 20 ) list: List[Int] = List( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 ) scala> list.fold( 1 ){(z, i) => i * z} res12: Int = 109641728 |
Легко, верно! Вы можете использовать более сложное использование фолда, но основная предпосылка та же:
http://oldfashionedsoftware.com/2009/07/30/lots-and-lots-of-foldleft-exa…
Ссылка: | Фрагменты Scala 1: сворачивание от нашего партнера JCG Йоса Дирксена в блоге Smart Java . |