Функторы

Функтор – это такой клас типов, которые реализуют функцию map. Это некий контейнер, к элементам которого можно применить функцию и в результате получить новый точно такой же контейнер (структура остается неизменной), но с новыми елементами. Иными словами, функтор применяет функцию к значениям, которые он содержит, а не к себе.

Функтором является тип Optional а также все последовательние типи в свифте: Dictionary, Array и Set.

К примеру, обычное сложение с использованием функтора будет выглядеть так:

func plusTwoNumbers(firstNumber: Int) -> (Int)-> Int {
    return { (secondNumber: Int) -> (Int) in
        return firstNumber + secondNumber
    }
}
let plus = plusTwoNumbers(5)
Optional.Some(10).map(plus)
// => .Some(15)

Функтор определяет, как будет будет реализована функция map и поскольку Optional это функтор, то у него есть своя реализация:

func map<U>(f: T -> U) -> U? {
  switch self {
  case .Some(let x): return f(x)
  case .None: return .None
}

Получается, что если мы в начале имеем None, то и в результате также будет иметь None. В случае с языками, которые не имеют опциональных типов, приходится делать проверку:

let user = Users.findByID(1)
if user != nil {
  return user.name
} else {
  return nil
}

Когда в свифте с исплозованием функтора Optional тоже самое можно сделать проще:

findByID(1).map(getUserName)
Share
Send
2016   functor   Swift
Your comment
won’t be published

HTML will not work

Ctrl + Enter
Popular