gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:14:08 25 4
gpt4 key购买 nike

在 Haskell 中我们看到 Foldable and Traversable landing in Haskell prelude

它们都对 sequences 进行操作。

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"]

我的问题是相当于Haskell的Foldable and Traversable只是一个sequence in Clojure

假设:

最佳答案

否。虽然任何类型的 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

您始终可以使用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给出某个幺半群的中性元素和 <*>到组合操作,所以我们得到类似归约的操作。例如,

foldMap (:[]) :: Term x -> [x]

给出术语中出现的变量列表。也就是说我们总能从 Traversable 中获取元素序列数据,但数据可能具有除这些元素之外的结构。 Term s 具有变量以外的结构(它们的 ValAdd s),并且不太清楚“cons”对于语法树意味着什么。

因此,虽然结构比序列多,但 TraversableTraversable界面为您提供更少的类似序列的操作。要点Traversable是概括map类和reduce类操作,而不是捕获列表性质。

关于haskell - Haskell 的 Foldable 和 Traversable 相当于 Clojure 中的一个序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com