Haskell的Foldable和Traversable相当于Clojure中的一个序列吗?

haw*_*eye 2 haskell clojure sequence traversable foldable

在Haskell中,我们看到Haskell前奏中的Foldable和Traversable 登陆.

这些都对序列进行操作.

Prelude Data.Sequence> map (\n -> replicate n 'a') [1,3,5]
["a","aaa","aaaaa"]
Prelude Data.Sequence> fmap (\n -> replicate n 'a') (1 <| 3 <| 5 <| empty)
fromList ["a","aaa","aaaaa"]
Run Code Online (Sandbox Code Playgroud)

我的问题是Haskell的Foldable和Traversable只相当于Clojure中的一个序列

假设:

pig*_*ker 16

虽然任何种类的Functor表示元素的有限序列将是Traversable(因此Foldable),有大量的其是其它结构的Traversable,但它不序列状的,因为它们不具有级联的一个明显的概念.将有一种方法来获得包含元素的序列,但结构可能不仅仅包含该序列.

什么Traversable f意思,实际上就是用型结构f x包含一个类型为有限个元素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
Run Code Online (Sandbox Code Playgroud)

您始终可以使用traverse对所有元素执行操作.我们fmap通过采取pure = id<*>普通的申请.

instance Functor Term where
  fmap = fmapDefault
Run Code Online (Sandbox Code Playgroud)

哪里

fmap :: (x -> y) -> Term x -> Term y
Run Code Online (Sandbox Code Playgroud)

实现同步重命名.

同时,Foldable实例

instance Foldable Term where
  foldMap = foldMapDefault
Run Code Online (Sandbox Code Playgroud)

采取pure一些monoid的中性元素和<*>组合操作,所以我们得到类似减少的操作.例如,

foldMap (:[]) :: Term x -> [x]
Run Code Online (Sandbox Code Playgroud)

给出术语中出现的变量列表.也就是说,我们总是可以从Traversable数据中获取元素序列,但数据可能具有除这些元素之外的结构.Terms具有除变量之外的结构(它们的Vals和Adds),并且不太清楚"cons"对于语法树是什么意思.

因此,虽然结构多于序列Traversable,但Traversable界面提供的序列操作更少.重点Traversable是概括类似map和类似reduce的操作,而不是捕获list -ness.