【问题标题】:Argo - what does mean arrow brackets in decode method?Argo - 解码方法中的箭头括号是什么意思?
【发布时间】:2017-01-11 11:29:52
【问题描述】:

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

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

&lt;^&gt;&lt;*&gt; 是什么意思?它们有什么区别?

【问题讨论】:

  • 我推荐github.com/Anviking/Decodable。我使用了一点 Argo,但我认为自从 Swift 添加对异常的支持以来,Decodable 所做的一切都变得更加干净。没有那么多奇怪的运算符。

标签: ios swift argo


【解决方案1】:

根据Github documentation...

&lt;^&gt;map 函数

&lt;*&gt;apply 函数

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

从 Github 页面链接。

注意阅读文档:)

【讨论】:

    【解决方案2】:

    tldr,第一个参数使用&lt;^&gt;,之后的每个参数使用&lt;*&gt;

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

    &lt;^&gt;,又名map,将函数应用于上下文中的值。该上下文可以是OptionalArrayDictionary 或许多其他上下文。在Optional 的上下文中,&lt;^&gt; 会将第一个参数(运算符左侧)中的函数应用于第二个参数(运算符右侧)中的可选值。如果可选值是.none.some(x),则结果将为.none,其中x 是在将可选值传递给函数后展开的结果。

    我希望这是有道理的。如果是这样,&lt;*&gt; 并没有太大的不同,只是第一个参数中的函数也包装在像Optional 这样的上下文中。所以你有一个Optional 函数和一个Optional 值,那么你将使用&lt;*&gt;。这就是我们在第一次使用&lt;^&gt; 之后使用&lt;*&gt; 的原因,因为在第一个&lt;^&gt;map 之后,我们留下了一个部分应用的构造函数(一个函数),它已经被包裹在&lt;^&gt; 的上下文。

    &lt;*&gt; 也取自 Haskell。在 Haskell 中,它被称为 Applicative 并使用完全相同的运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多