2017-01-11 6 views
0

私はjsonの解読のためにArgoをマスターしようとします。ドキュメンテーションではデコード機能の一例Argo - デコード方式で矢印の意味は何ですか?

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

<^><*>はどういう意味があるのでしょうか?それらの違いは何ですか?

+0

https://github.com/Anviking/Decodableをお勧めします。私はArgoを少し使いましたが、DecodableはSwiftが例外のサポートを追加して以来ずっとずっときれいなことをすべてやっていると思います。多くの奇妙な演算子ではありません。 – Andreas

答えて

2

tldrの場合、最初のパラメータには<^>を使用し、その後はすべてのパラメータに<*>を使用してください。

長い回答: <^>は、Swiftのmap機能と同じです。 Haskell(純粋に関数型プログラミング言語)から借りた演算子です。 Haskellでは実際には<$>ですが、Swiftはその演算子で$を使用できないため、代わりに<^>を選択しました。

<^>、別名mapは、コンテキスト内の値に関数を適用します。そのコンテキストは、Optional,ArrayDictionary、または他の多くのものが可能です。 Optionalのコンテキストでは、<^>は、第1引数(演算子の左側)の関数を第2引数の右側の値(演算子の右側)に適用します。オプションの値が.noneまたは.some(x)の場合、結果は.noneになります。ここで、xは、関数に渡された後のアンラップされたオプションの値です。

私はそれが理にかなっていると思います。その場合、<*>は、第1引数の関数もOptionalのようなコンテキストでラップされている点を除いてあまり違いはありません。したがって、Optional関数とOptional値がある場合、<*>を使用します。最初の<^>mapの後には、<^>というコンテキストでラップされている部分的に適用されたコンストラクタ(関数)が残っているため、を初めて使用したのはこのためです。

<*>は、ハスケルからも取得されます。ハスケルではApplicativeと呼ばれ、まったく同じ演算子を使用します。

関連する問題