haskell - 如何为这种类型编写可折叠实例?
问题描述
我定义了以下数据类型:
data SynthesisTreeResult comp a = CompNode (comp a) [SynthesisTreeResult comp a]
| InputLeaf Location
我希望能够将其转换为[comp a]
using类型的列表toList
,这需要Foldable
.
我试图通过实现来编写一个实例foldMap
:
class Foldable f where
foldMap :: Monoid m => (a -> m) -> f a -> m
但是,因为comp :: * -> *
,我必须写instance Foldable (SynthesisTreeResult comp) where ...
,这导致foldMap
有以下类型
foldMap :: Monoid m => (a -> m) -> SynthesisTreeResult comp a -> m
但是我需要
foldMap :: Monoid m => (comp a -> m) -> SynthesisTreeResult comp a -> m
能够折叠它。
可能吗?也许我需要Functor
强加comp
?
解决方案
感谢@Willem Van Onsem的提示,我找到了正确的例子:
instance Foldable comp => Foldable (SynthesisTreeResult comp) where
foldMap f (CompNode comp children) = mappend (foldMap f comp) $ mconcat $ map (foldMap f) children
推荐阅读
- python - 我的 EmployeeForm 类中的“Employee_Name”的自定义验证不起作用
- javascript - 输入不工作,但在其他地方工作
- git - WebStorm - 当版本控制提交时替换整个文件而不是特殊更改
- javascript - 在 React 中访问第三方组件的输入
- javascript - 从导致问题的数组中删除特定元素
- php - Laravel 属于试图获取非对象的属性
- sql - 在 Hive 中选择方括号和引号之间的值
- javascript - 如何使用空数组填写数量
- solr - Solr CDCR(跨数据中心复制)目标及其提交
- python - Python 和 Google 助理:名称未定义