标签: foldable

遍历对应用上下文意味着什么?

我试图在https://namc.in/2018-02-05-foldables-traversals的帮助下了解Traversable 。

作者在某处提到了以下句子:

对应用上下文而言,可遍历是针对Monoid值的可折叠。

他试图澄清什么?

我之间没有联系Foldable to Monoid

请提供一个例子。

haskell applicative monoids traversable foldable

7
推荐指数
1
解决办法
105
查看次数

加入的 Bitraversable 是否需要 Monad?

尽管标题充满了行话,但我认为这个问题并不复杂。

人物介绍

这里有两个重要的 Functor 组合子。Flip等同于 haskell 函数,flip但对类型进行操作

newtype Flip p a b
  = Flip
    { unFlip :: p b a
    }
Run Code Online (Sandbox Code Playgroud)

Join相当于对类型在W组合子,它需要一个bifunctor和沿其两个参数产生算符

newtype Join p a
  = W
    { unW :: p a a
    }
Run Code Online (Sandbox Code Playgroud)

可遍历

现在Foldable可以制作以下实例:

instance
  ( forall a . Foldable (p a)
  , forall a . Foldable (Flip p a)
  )
    => Foldable (Join p) where
  foldr g x (W xs) = foldr g (foldr g x xs) (Flip …
Run Code Online (Sandbox Code Playgroud)

haskell applicative traversable foldable

7
推荐指数
0
解决办法
109
查看次数

为什么这个实现是可折叠类型类的一个坏实例?

我正在阅读精彩的Haskell Book。在 Traversable 一章(21)的最后,我需要为以下 Tree 编写一个实例:

data Tree a =
    Empty
  | Leaf a
  | Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案的完整代码链接。练习建议尝试同时实现foldMapfoldr。这就是我的实现方式foldr(没有考虑调用顺序):

foldr _ z Empty = z
foldr f z (Leaf x) = f x z
foldr f z (Node left x right) = 
  f x $ foldr f (foldr f z left) right
Run Code Online (Sandbox Code Playgroud)

然后我实现foldMap如下:

foldMap f Empty = mempty
foldMap f (Leaf x) = …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass quickcheck foldable typeclass-laws

7
推荐指数
1
解决办法
99
查看次数

MonoFoldable有什么损失吗?

单可遍历包中的MonoFoldable似乎能够实现所有通常的可折叠容器等等,例如,Bytestring可以制作类似于同类元组的东西,MonoFoldable但不能Foldable.我的问题是,除了需要一些先进的GHC功能之外MonoFoldable,我们是否会丢失任何我们没有的Foldable内容,使得它对于实例编写者来说稍微有些棘手,并且可能会收到更加丑陋的错误消息?

例如,是否有一些代码在使用Foldable编译时但是MonoFoldable没有推断类型?或者其他任何使客户端(不是实例编写器代码)明显更简单的Foldable东西MonoFoldable

haskell classy-prelude foldable

6
推荐指数
1
解决办法
213
查看次数

我可以用“递归方案” cata来写“ foldr”(或“ foldMap”)吗?

我最近阅读了关于递归方案的描述,其中将同构同构描述为广义foldr

是否可以在所有情况下Foldable(通过foldrfoldMap)编写一个实例cata

haskell fold catamorphism foldable recursion-schemes

6
推荐指数
1
解决办法
122
查看次数

是否有关于可折叠类型类的法律限制可折叠实例的派生方式?

我正在尝试使用FoldableHaskell 中的类型类,以以下数据类型为例:

data Tree a = Empty
            | Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)

如果我使用DeriveFoldableGHC 扩展,它似乎Foldable沿着

instance Foldable Tree where
  foldMap _ Empty = mempty
  foldMap f (Node l n r) = (foldMap f l) <> (f n) <> (foldMap f r)
Run Code Online (Sandbox Code Playgroud)

即,树的中序遍历。但是,我没有看到任何明显的阻止不同Foldable实例的东西,例如预序遍历:

instance Foldable Tree where
  foldMap _ Empty = mempty
  foldMap f (Node l n r) = (f n) <> (foldMap f l) <> (foldMap f r)
Run Code Online (Sandbox Code Playgroud)

Foldable类型类是否存在使预序遍历实例不合法的法律?

haskell deriving foldable

6
推荐指数
3
解决办法
137
查看次数

如何使用foldr(或foldMap)实现最小值?

我想用foldr或foldMap实现最小值。根据练习,它应具有以下定义:

mini :: (Foldable t, Ord a) => t a -> Maybe a -- named "mini" to avoid name clash
Run Code Online (Sandbox Code Playgroud)

听起来很简单,但是我不知道可以在下面的X中添加什么才能使其起作用。请帮忙?

mini xs = Just (foldr min X xs)
Run Code Online (Sandbox Code Playgroud)

而且,您也可以通过foldMap向我展示如何获得奖励积分,但这似乎更加困难。

haskell minimum foldable

5
推荐指数
1
解决办法
390
查看次数

为什么Monoid不是foldr/foldl的要求?

我正在看FoldableHaskell 的课程.方法二fold,foldMap需要一个Monoid的实例.但是,foldr或者foldl没有任何这样的约束.

fold :: Monoid m => t m -> m
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
foldl :: (b -> a -> b) -> b -> t a -> b
Run Code Online (Sandbox Code Playgroud)

对于foldr/ foldl等效的结果,是否应该限制给定的折叠函数是关联的?有没有例子,foldr/foldl的结果在同一个列表中是不同的?

不可折叠的实例不应包含Monoidal值吗?或者可折叠更一般?

haskell fold monoids foldable

5
推荐指数
1
解决办法
446
查看次数

由lambda内部的长度引起的Foldable没有实例

第一个问题在这里,完全是haskell上的菜鸟,所以请和我好心:)

我正在玩这个 haskell练习的第6个问题

并最终得到了这个代码的解决方案(或我希望的类似的东西)

combinations gr lis = filter clean $ sequence $ replicate gr lis
where
    clean string
        | total > gr = False
        | otherwise = True
        where total = sum [ rpt c string | c <- string]
    rpt chr list = length $ filter (== chr) list
Run Code Online (Sandbox Code Playgroud)

我想要突出显示的部分是函数'rpt',它计算字符在字符串中重复的次数,例如:"aaba" - > [3313](3来自字母a,它重复3次)​​"aaccva" - > [332213]

后来我尝试使用lambda和map创建函数,结果如下:

rpt chr list = map (\chr -> length $ filter (== chr)) list
Run Code Online (Sandbox Code Playgroud)

并且首先ghci告诉我使用FlexibleContext来允许这个,但如果我这样做,它会产生:

<interactive>:7:1:
No instance for (Foldable ((->) …
Run Code Online (Sandbox Code Playgroud)

lambda haskell foldable

5
推荐指数
1
解决办法
484
查看次数

类型foldMap :: (Monoid m) =&gt; (a -&gt; m) -&gt; fa -&gt; m 是什么意思以及如何实现它?

有人可以解释该类型的含义以及如何实现它吗?

\n\n
class Foldable f where\n  foldMap :: (Monoid m) => (a -> m) -> f a -> m\n
Run Code Online (Sandbox Code Playgroud)\n\n

基于https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Foldable.html#v:foldMap,\n他们将其解释为“将结构的每个元素映射到幺半群,然后组合结果。” 但我不太明白这意味着什么。如何将元素映射到 Monoid 的结构?

\n\n

我尝试了 \n foldMap f = mconcat . (<$>) f\n但收到此错误:

\n\n
 \xe2\x80\xa2 Couldn\'t match type \xe2\x80\x98f\xe2\x80\x99 with \xe2\x80\x98[]\xe2\x80\x99\n      \xe2\x80\x98f\xe2\x80\x99 is a rigid type variable bound by\n        the class declaration for \xe2\x80\x98Foldable\xe2\x80\x99\n        at traversable.hs:41:16\n      Expected type: f a -> m\n        Actual type: [a] -> m\n    \xe2\x80\xa2 In the expression: mconcat . (<$>) f\n      In …
Run Code Online (Sandbox Code Playgroud)

haskell foldable

5
推荐指数
1
解决办法
1438
查看次数