Argo - 解码方法中的箭头括号是什么意思?

时间:2017-01-11 11:29:53

标签: ios swift argo

我尝试掌握Argo进行json解码。在文档中有解码函数的例子

extension User: Decodable {
  static func decode(j: JSON) -> Decoded<User> {
    return curry(User.init)
     <^> j <| "id"
     <*> j <| "name"
    }  
}

<^><*>是什么意思?他们之间有什么区别?

2 个答案:

答案 0 :(得分:5)

根据Github documentation ...

<^>map函数

<*>apply函数

这两个都在这里描述...... https://robots.thoughtbot.com/functional-swift-for-dealing-with-optional-values

从Github页面链接。

N.B。阅读文档:)

答案 1 :(得分:2)

tldr,使用<*>作为第一个参数,然后对每个参数使用<^>

答案很长: map与Swift的<$>函数相同。它是从Haskell(一种纯函数式编程语言)借用的运算符。虽然,在Haskell中它实际上是$但是Swift不能在其运算符中使用<^>,所以我们(以及社区中的其他人)选择了<^>

map,又名Optional,将函数应用于上下文中的值。该上下文可以是ArrayDictionaryOptional或其他许多内容。在<^>的上下文中,.none将第一个参数(运算符的左侧)中的函数应用于第二个参数(运算符的右侧)中的可选值。如果可选值为.none.some(x),则结果为x,其中<*>是传递到函数后解包的可选值的结果。

我希望这是有道理的。如果是这样,Optional没有太大的不同,除了第一个参数中的函数也包含在像Optional这样的上下文中。因此,您拥有Optional函数和<*>值,那么您将使用<*>。这就是我们第一次使用<^>后使用<^>的原因,因为在第一个map<^>之后,我们留下了部分应用的构造函数(a函数),由<*>包装在上下文中。

Applicative也来自Haskell。在Haskell中,它被称为{{1}}并使用完全相同的运算符。