作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Haskell。我有一个看起来像这样的列表:
data TwoValueList a = Empty | Node a a (TwoValueList a)
我想做这个
Foldable
,这样我就可以进行如下计算:
sum (Node 0 1 (Node 2 3 Empty)) --should produce 6
如果只有一个值,那将很容易:
data OneValueList = Empty | Node a (OneValueList a)
instance Foldable OneValueList where
foldr f b Empty = b
foldr f b (Node a rest) = f a (foldr f b rest)
但是,如果一个节点内有两个值,我无法细化类型,因为
f
需要
a
和
b
,但我必须申请
f
两个
a
TwoValueList
的内部并以某种方式组合它们。我是否缺少其他类型约束?
最佳答案
data TwoValueList a = Empty | Node a a (TwoValueList a)
instance Foldable TwoValueList where
foldr _ ini Empty = ini
foldr f ini (Node x y xs) = f x $ f y $ foldr f ini xs
其工作方式是
foldr
在
TwoValueList
的递归实例上递归调用自身相互嵌入,直到满足
Empty
.此时它返回
ini
这是初始值,调用堆栈会解决上面的所有函数调用。
关于haskell - 如何为这个特定结构实现 foldr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69959424/
我是一名优秀的程序员,十分优秀!