我尝试掌握Argo进行json解码。在文档中有解码函数的例子
extension User: Decodable {
static func decode(j: JSON) -> Decoded<User> {
return curry(User.init)
<^> j <| "id"
<*> j <| "name"
}
}
<^>
和<*>
是什么意思?他们之间有什么区别?
答案 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
,将函数应用于上下文中的值。该上下文可以是Array
,Dictionary
,Optional
或其他许多内容。在<^>
的上下文中,.none
将第一个参数(运算符的左侧)中的函数应用于第二个参数(运算符的右侧)中的可选值。如果可选值为.none
或.some(x)
,则结果为x
,其中<*>
是传递到函数后解包的可选值的结果。
我希望这是有道理的。如果是这样,Optional
没有太大的不同,除了第一个参数中的函数也包含在像Optional
这样的上下文中。因此,您拥有Optional
函数和<*>
值,那么您将使用<*>
。这就是我们第一次使用<^>
后使用<^>
的原因,因为在第一个map
,<^>
之后,我们留下了部分应用的构造函数(a函数),由<*>
包装在上下文中。
Applicative
也来自Haskell。在Haskell中,它被称为{{1}}并使用完全相同的运算符。