Functional Swift

Запускаем Swift REPL (Read Eval Print Loop). Для этого открываем терминал и выполняем команду: swift (Xcode должен быть установлен). Более подробно здесь: Introduction to the Swift REPL.

Welcome to Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81). Type :help for assistance.
  1> let l = [1,2,3]
l: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}

Напишем простую функцию, которая возвращает список заданного размера, заполненный указанным значением:

  2> func replicate(count: Int, value: Int) -> Array<Int> {
  3.     return Array(0..<count).map { _ in value }
  4. }
  5> replicate(3, value: 1)
$R1: [Int] = 3 values {
  [0] = 1
  [1] = 1
  [2] = 1
}

Тоже самое можно было сделать с помощью конструктора: Array(count: count, repeatedValue: value). Допустим у нас есть список [1, 2, 3], а нам нужно преобразовать его в список вида: [1, 1, 1, 2, 2, 2, 3, 3, 3]:

  6> func replicateList(count: Int, list: Array<Int>) -> Array<Int> {
  7.     guard list.count > 0 else { return [] }
  8.     return replicate(count, value: list[0]) + replicateList(count, list: Array(list[1..<list.count]))
  9. }
 10> replicateList(3, list: [1, 2, 3])
$R2: [Int] = 9 values {
  [0] = 1
  [1] = 1
  [2] = 1
  [3] = 2
  [4] = 2
  [5] = 2
  [6] = 3
  [7] = 3
  [8] = 3
}

Как видим, никаких циклов.

Функции суммирования и произведения элементов списка.

func product(list: [Int]) -> Int {
    return list.reduce(1) { $0 * $1 }
}

func sum(list: [Int]) -> Int {
    return list.reduce(0) { $0 + $1 }
}

Генератор простых чисел.

func primes(numbers: [Int]) -> [Int] {
    guard !numbers.isEmpty else { return [] }
    let first = numbers[0]
    return [first] + primes(numbers[1..<numbers.count].filter { $0 % first > 0 })
}

Опубликовано: Февраль 24, 2016 ~ Swift, Functional Programming