Арго - что означает стрелка в методе декодирования?
Я пытаюсь освоить Арго для JSON декодирования. В документации есть пример функции декодирования
extension User: Decodable {
static func decode(j: JSON) -> Decoded<User> {
return curry(User.init)
<^> j <| "id"
<*> j <| "name"
}
}
Что значит <^>
а также <*>
имею в виду? В чем разница между ними?
2 ответа
Tldr, использовать <^>
для первого параметра и использования <*>
для каждого параметра после этого.
Длинный ответ:<^>
такой же, как у Свифта map
функция. Этот оператор заимствован из Haskell (чисто функциональный язык программирования). Хотя в Хаскеле это на самом деле <$>
но Свифт не может использовать $
в его операторах, поэтому мы (и другие в сообществе) выбрали <^>
вместо.
<^>
ака map
, применяет функцию к значению внутри контекста. Этот контекст может быть Optional
, Array
, Dictionary
или много других. В контексте Optional
, <^>
будет применять функцию в первом аргументе (слева от оператора) к необязательному значению во втором аргументе (справа от оператора). Результат будет .none
если необязательное значение было .none
или же .some(x)
где x
является результатом необязательного необязательного значения после его передачи в функцию.
Я надеюсь, что в этом есть смысл. Если так, <*>
не сильно отличается, за исключением того, что функция в первом аргументе также обернута в такой контекст, как Optional
, Итак, у вас есть Optional
функция и Optional
значение, то вы бы использовали <*>
, Вот почему мы используем <*>
после того, как мы используем <^>
в первый раз, потому что после первого <^>
, map
у нас остался частично примененный конструктор (функция), который был обернут в контекст <^>
,
<*>
взят из Хаскелла. В Хаскеле это называется Applicative
и использует тот же оператор.
Согласно документации Github...
<^>
это map
функция
а также
<*>
это apply
функция
Оба из них описаны здесь... https://robots.thoughtbot.com/functional-swift-for-dealing-with-optional-values
Ссылка со страницы Github.
NB Читайте документацию:)