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

Argo - what does mean arrow brackets in decode method?

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

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

<^><*> 是什么意思?它们有什么区别?

根据 Github documentation...

<^>map 函数

<*>apply 函数

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

链接自 Github 页面。

N.B。阅读文档:)

tldr,第一个参数使用 <^>,之后的每个参数使用 <*>

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

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

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

包装在上下文中

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