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.
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |