tldrの場合、最初のパラメータには<^>
を使用し、その後はすべてのパラメータに<*>
を使用してください。
長い回答: <^>
は、Swiftのmap
機能と同じです。 Haskell(純粋に関数型プログラミング言語)から借りた演算子です。 Haskellでは実際には<$>
ですが、Swiftはその演算子で$
を使用できないため、代わりに<^>
を選択しました。
<^>
、別名map
は、コンテキスト内の値に関数を適用します。そのコンテキストは、Optional
,Array
、Dictionary
、または他の多くのものが可能です。 Optional
のコンテキストでは、<^>
は、第1引数(演算子の左側)の関数を第2引数の右側の値(演算子の右側)に適用します。オプションの値が.none
または.some(x)
の場合、結果は.none
になります。ここで、x
は、関数に渡された後のアンラップされたオプションの値です。
私はそれが理にかなっていると思います。その場合、<*>
は、第1引数の関数もOptional
のようなコンテキストでラップされている点を除いてあまり違いはありません。したがって、Optional
関数とOptional
値がある場合、<*>
を使用します。最初の<^>
、map
の後には、<^>
というコンテキストでラップされている部分的に適用されたコンストラクタ(関数)が残っているため、を初めて使用したのはこのためです。
<*>
は、ハスケルからも取得されます。ハスケルではApplicative
と呼ばれ、まったく同じ演算子を使用します。
https://github.com/Anviking/Decodableをお勧めします。私はArgoを少し使いましたが、DecodableはSwiftが例外のサポートを追加して以来ずっとずっときれいなことをすべてやっていると思います。多くの奇妙な演算子ではありません。 – Andreas