Я работаю над Функциональным программированием в Swift, и у меня действительно нет хорошего способа понять различия в концепции, представленной в Раздел опций.
Образец при работе с опциями имеет тенденцию:
if let thing = optionalThing {
return doThing(thing)
}
else {
return nil
}
Эта идиома выполняется лаконично со стандартной библиотечной функцией map
map(optionalThing) { thing in doThing(thing) }
Затем книга продолжает и вводит понятие необязательного связывания, в котором моя способность дифференцироваться начинает разрушаться.
В книге описывается функция map
:
func map<T, U>(optional: T?, f: T -> U) -> U?
{
if let x = optional {
return f(x)
}
else {
return nil
}
}
И также помогает нам определить необязательную функцию привязки. Примечание: в книге используется оператор >>=
, но я решил использовать именованную функцию, потому что она помогает мне увидеть сходство.
func optionalBind<T, U>(optional: T?, f: T -> U?) -> U?
{
if let x = optional {
return f(x)
}
else {
return nil
}
}
Реализация для обоих этих методов выглядит идентично мне. Единственное различие между ними - это аргумент функции, который они принимают:
-
map
принимает функцию, которая преобразует T в U -
optionalBind
принимает функцию, которая преобразует T в необязательный U
Результат "гнездования" этих вызовов функций вредит моему мозгу:
func addOptionalsBind(optionalX: Int?, optionalY: Int?) -> Int?
{
return optionalBind(optionalX) { x in
optionalBind(optionalY) { y in
x + y
}
}
}
func addOptionalsMap(optionalX: Int?, optionalY: Int?) -> Int?
{
return map(optionalX) { x in
map(optionalY) { y in
x + y
}
}
}
- Функция
addOptionalsBind
выполняет именно то, что вы ожидаете от нее. - Функция
addOptionalsMap
не компилируется:'Int??' не конвертируется в 'Int?'