我尝试掌握 Argo 进行 json 解码。在文档中有解码功能的例子
extension User: Decodable {
static func decode(j: JSON) -> Decoded<User> {
return curry(User.init)
<^> j <| "id"
<*> j <| "name"
}
}
是什么<^>意思<*>?它们之间有什么区别?
根据Github 文档...
<^>是map函数
和
<*>是apply函数
这两个都在这里描述...... https://robots.thoughtbot.com/functional-swift-for-dealing-with-optional-values
从 Github 页面链接。
注意阅读文档:)
tldr,<^>用于第一个参数并<*>用于之后的每个参数。
长答案:
<^>与 Swift 的map功能相同。它是从 Haskell(一种纯函数式编程语言)借来的运算符。虽然,在 Haskell 中它实际上是<$>,但 Swift 不能$在其运算符中使用,所以我们(和社区中的其他人)选择了<^>。
<^>,又名map,将函数应用于上下文中的值。该上下文可以是Optional、Array、Dictionary或许多其他上下文。在 的上下文中Optional,<^>会将第一个参数(运算符左侧)中的函数应用于第二个参数(运算符右侧)中的可选值。结果将是.none如果可选值是.none或者在将其传递给函数后展开的可选值的结果在.some(x)哪里。x
我希望这是有道理的。如果<*>是这样,除了第一个参数中的函数也被包装在一个上下文中(如Optional. 所以你有一个Optional函数和一个Optional值,然后你会使用<*>. 这就是我们在第一次使用<*>之后使用<^>的原因,因为在第一次 , 之后<^>,map我们留下了一个部分应用的构造函数(一个函数),它已经被包装在上下文中<^>。
<*>也取自 Haskell。在 Haskell 中,它被调用Applicative并使用完全相同的运算符。