1 post tagged

applicatives

Апликативные функторы

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

extension Optional {
  func apply<U>(f: (Wrapped -> U)?) -> U? {
    switch f {
      case .Some(let someF): return self.map(someF)
      case .None: return .None
    }
  }
}

Теперь можно взять функцию сложения plusTwoNumbers из предыдущего поста об функторах и что-бы применить ее к значению, нужно обернуть в тот же контекст Optional и передать функции apply:

let plus = plusTwoNumbers(5)
Optional.Some(10).apply(Optional.Some(plus))
// => .Some(15)

Или для удобства написать свой оператор:

infix operator <*> { associativity left }

func <*><T, U>(f: (T -> U)?, a: T?) -> U? {
  return a.apply(f)
}

Optional.Some(plus) <*> Optional.Some(10)
// => .Some(15)
2016   applicatives   functor   Swift