いいえFunctor
。要素の有限シーケンスを表すあらゆる種類の表現はTraversable
(したがって) になりますが、連結の明らかな概念がないという点で、 であるがシーケンスのようなものではないFoldable
他の構造がたくさんあります。Traversable
含まれている要素のシーケンスを取得する方法はありますが、構造はそのシーケンス以上のもので構成されている場合があります。
Traversable f
事実上、 type を持つ構造体は、 typef x
の有限個の要素を含むこと、および構造体が の各要素を 1 回だけ訪問するx
何らかの方法があることを意味します。したがって、「変数を含むと見なされる構文内の用語」のようなものは.traverse
x
Traversable
data Term x
= Var x
| Val Integer
| Add (Term x) (Term x)
instance Traversable Term where
traverse f (Var x) = pure Var <*> f x
traverse f (Val i) = pure (Val i)
traverse f (Add s t) = pure Add <*> traverse f s <*> traverse f t
traverse
すべての要素に対していつでも操作を実行できます。fmap
撮って貰ってpure = id
普通の<*>
アプリとは。
instance Functor Term where
fmap = fmapDefault
どこ
fmap :: (x -> y) -> Term x -> Term y
同時名前変更を実装します。
その間、Foldable
インスタンス
instance Foldable Term where
foldMap = foldMapDefault
はpure
モノイドのニュートラル要素と<*>
結合操作を与えるため、reduce のような操作が得られます。例えば、
foldMap (:[]) :: Term x -> [x]
項に現れる変数のリストを与える. つまり、Traversable
データから要素のシーケンスを常に取得できますが、データはそれらの要素以外の構造を持つ場合があります。s には変数 (それらの およびs)Term
以外の構造があり、構文ツリーで "cons" が何を意味するかはあまり明確ではありません。Val
Add
そのため、シーケンスよりも多くの構造体が存在しますがTraversable
、Traversable
インターフェイスではシーケンスのような操作が少なくなります。のポイントは、 list性をキャプチャするのではなく、mapのような操作とreduceTraversable
のような操作を一般化することです。