0

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

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

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

4

2 回答 2

5

根据Github 文档...

<^>map函数

<*>apply函数

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

从 Github 页面链接。

注意阅读文档:)

于 2017-01-11T11:35:00.990 回答
2

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

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

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

我希望这是有道理的。如果<*>是这样,除了第一个参数中的函数也被包装在一个上下文中(如Optional. 所以你有一个Optional函数和一个Optional值,然后你会使用<*>. 这就是我们在第一次使用<*>之后使用<^>的原因,因为在第一次 , 之后<^>map我们留下了一个部分应用的构造函数(一个函数),它已经被包装在上下文中<^>

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

于 2017-01-11T17:32:36.053 回答