traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
こんにちは、私は署名を理解できない機能がたくさんあります
。もちろん、トラバースには2つの引数があります。最初は関数です。しかし、
何を意味するのですか(a -> f b)
?私は(a -> b)
を理解することができます。
と同様に、t a
,理解署名
私に説明してもらえますか?
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
こんにちは、私は署名を理解できない機能がたくさんあります
。もちろん、トラバースには2つの引数があります。最初は関数です。しかし、
何を意味するのですか(a -> f b)
?私は(a -> b)
を理解することができます。
と同様に、t a
,理解署名
私に説明してもらえますか?
traverse
はタイプ派生関数なので、この関数の動作は曖昧にはt
を選択することによって決まります。これは>>=
またはfmap
と似ていません。しかし、そのような場合と同じように、行動のルールがあります。このルールはtraverse
がa -> f b
という機能を持ち、a
からb
への効果的な変換であり、全体の「コンテナ」がa
で動作するようにリフトし、それぞれのローカル変換の効果を収集するという考えを捉えています。例えば
、我々はMaybe a
を持っている場合traverse
の実装はリスト
traverse f [a1, a2, ...] = (:) <$> f a1 <*> ((:) <$> f a2 <*> ...))
私たちは「効果」f
であるという事実を利用している方法をお知らせするために
traverse f (Just a) = Just <$> f a
traverse f Nothing = pure Nothing
だろうファンクタだけでなく、適用可能なので、我々はf a
とf b
の2つのf-ful計算をとり、それらを一緒に粉砕してf (a, b)
を得ることができる。 すべてトラバースが行うことができることを説明するいくつかの法律を考え出し、要素にf
を適用し、外部への影響を収集しながら元のt a
を構築します。私たちは、
traverse Identity = Identity -- We don't lose elements
t . traverse f = traverse (t . f) -- For nicely composing t
traverse (Compose . fmap g . f) = Compose . fmap (traverse g) . traverse f
は今、これは非常に複雑に見えますが、それはやっているすべては「基本的に周りの散策や地元の変換を適用する」の意味を明確にあると言います。このすべてはあなただけtraverse
が何をするか理解するために署名を読むことはできませんが、署名のためのOK直感が
a
秒のf :: a -> f b
f
のfmap
f (t b)
を取得し、戻って繰り返しf
を適用することで得b
の完全なファンクタを取得ただし、traverse
は奇妙な方法で使用することができます。たとえば、レンズパッケージには、非常に奇妙なファンクタを使ってtraverse
を使用することができます。
簡単なテストとして、法律traverse
を使用してt
にfmap
を実装する方法を理解できますか?つまり、これらの両方がトラバースインスタンスもFunctor
とFoldable
を満たしているという事実の結果である
fmapOverkill :: Traversable f => (a -> b) -> (f a -> f b)
それともheadMay
headMay :: Traversable t => t a -> Maybe a
です!
'f'は型コンストラクタを表します(' f = Maybe'と考えてください) 't'(' t = [] ')と思っています - '(a - > Maybe b) - >たぶん[b] '? – Carsten
この場合の感情を知りたければ、 '' traverse(\ a - > evenでもあれば '' div' 2)以外の何も再生できません)[2,4,6] ''(入力リストを変更してみてください);) – Carsten
ありがとうございます。私に教えてください:tはいつも[a]を意味しますか? –