我试图在https://namc.in/2018-02-05-foldables-traversals的帮助下了解Traversable 。
作者在某处提到了以下句子:
对应用上下文而言,可遍历是针对Monoid值的可折叠。
他试图澄清什么?
我之间没有联系Foldable to Monoid。
请提供一个例子。
尽管标题充满了行话,但我认为这个问题并不复杂。
这里有两个重要的 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 Book。在 Traversable 一章(21)的最后,我需要为以下 Tree 编写一个实例:
data Tree a =
Empty
| Leaf a
| Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案的完整代码的链接。练习建议尝试同时实现foldMap和foldr。这就是我的实现方式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) 单可遍历包中的MonoFoldable似乎能够实现所有通常的可折叠容器等等,例如,Bytestring可以制作类似于同类元组的东西,MonoFoldable但不能Foldable.我的问题是,除了需要一些先进的GHC功能之外MonoFoldable,我们是否会丢失任何我们没有的Foldable内容,使得它对于实例编写者来说稍微有些棘手,并且可能会收到更加丑陋的错误消息?
例如,是否有一些代码在使用Foldable编译时但是MonoFoldable没有推断类型?或者其他任何使客户端(不是实例编写器代码)明显更简单的Foldable东西MonoFoldable?
我最近阅读了关于递归方案的描述,其中将同构同构描述为广义foldr。
是否可以在所有情况下Foldable(通过foldr或foldMap)编写一个实例cata?
我正在尝试使用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类型类是否存在使预序遍历实例不合法的法律?
我想用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向我展示如何获得奖励积分,但这似乎更加困难。
我正在看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上的菜鸟,所以请和我好心:)
我正在玩这个 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) 有人可以解释该类型的含义以及如何实现它吗?
\n\nclass Foldable f where\n foldMap :: (Monoid m) => (a -> m) -> f a -> m\nRun 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但收到此错误:
\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) foldable ×10
haskell ×10
applicative ×2
fold ×2
monoids ×2
traversable ×2
catamorphism ×1
deriving ×1
lambda ×1
minimum ×1
quickcheck ×1
typeclass ×1