Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 应用性、可折叠性和可遍历性之间的关系是什么?_Haskell - Fatal编程技术网

Haskell 应用性、可折叠性和可遍历性之间的关系是什么?

Haskell 应用性、可折叠性和可遍历性之间的关系是什么?,haskell,Haskell,我试图从Applicative界面了解执行任何遍历所需的具体内容。我被卡住了,因为它们没有在默认实现中使用,就好像约束要严格一样。Haskell的类型系统是否太弱,无法描述实际需求 -- | Map each element of a structure to an action, evaluate these actions -- from left to right, and collect the results. For a version that ignores -- the res

我试图从
Applicative
界面了解执行任何
遍历所需的具体内容。我被卡住了,因为它们没有在默认实现中使用,就好像约束要严格一样。Haskell的类型系统是否太弱,无法描述实际需求

-- | Map each element of a structure to an action, evaluate these actions
-- from left to right, and collect the results. For a version that ignores
-- the results see 'Data.Foldable.traverse_'.
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
traverse f = sequenceA . fmap f

-- | Evaluate each action in the structure from left to right, and
-- and collect the results. For a version that ignores the results
-- see 'Data.Foldable.sequenceA_'.
sequenceA :: Applicative f => t (f a) -> f (t a)
sequenceA = traverse id

一个可能相关的附带问题是,为什么
sequenceA\ucode>在
可折叠
中定义?

遍历
sequenceA
都需要处理
可遍历
为空时发生的情况。然后,在
应用程序
上下文中就不会有任何元素可用于将其他内容添加到其上,因此需要

你给出的定义有点误导,因为正如你所指出的,它们是相互依赖的。当您实际实现其中一个时,您将遇到空集合问题。您将需要
,因为
Functor
没有为某些Functor
f
提供聚合不同
fa
值的工具

因此,存在
Applicative
约束,因为对于大多数类型,为了实现
traverse
sequenceA
您需要
Applicative
提供的工具

也就是说,有些类型不需要纯
或不需要
。如果您的收藏不能为空,则不需要
,例如
非空
。如果您的收藏从未包含多个元素,则不需要
,例如
可能
。有时您不需要任何一个,您只需要
fmap
,例如元组部分,如
(a,)


Haskell可以有一个更细粒度的typeclass层次结构,它将
Applicative
分解为更细粒度的部分,分别为
pure
创建不同版本的
可遍历的
。Edward Kmett的库
semigroupoids
朝着这个方向发展,尽管它并不完美,因为它不能向
基类添加实际的超类。它有
Apply
,它是
Applicative
,但没有
pure
,还有
Traversable1
,它是
Traversable1
的变体,它使用
Apply
而不是
Applicative
,因此要求其类型永远不能为空

注意,其他生态系统选择了更细粒度的类型类层次结构(参见Scala的
cats
scalaz
库)。我个人认为这样的区分偶尔有用,但并非绝对有用


至于你的第二个问题,如果你所知道的只是拆掉一些东西,你仍然可以在这一过程中执行效果,但你不一定能恢复原来的结构。因此,为什么
sequenceA\uuu
是可折叠的。它的功能远远不如
sequenceA

第二个问题的可能重复似乎与第一个问题完全无关。但答案很简单:
Foldable
足够强大,可以实现
sequenceA_
“Haskell可以有一个更细粒度的typeclass层次结构,它将
Applicative
分解为更细粒度的部分,为
pure
提供单独的类--PureScript有这一点,定义
Apply
)和
Applicative
pure
)作为单独的类型类。