【问题标题】:Monoid on any Foldable任何可折叠的 Monoid
【发布时间】:2016-05-04 22:54:36
【问题描述】:

我正在尝试在 haskell 上创建一个 Monoid 的实例,该 Monoid 可以应用于任何包含可比较元素并返回存储的最大值的可折叠结构。

到目前为止我有这个

import Data.List
import Data.Functor
import Data.Monoid
import Data.Foldable
import Data.Tree

newtype Max a = Max { getMax :: Maybe a}
   deriving (Eq, Ord, Show, Read)

instance Ord a => Monoid (Max a) where
   mempty = Max Nothing
   mappend (Max x) (Max y) = Max (max x y)

它在列表中完美运行,但在 Trees 上有一些问题。当我在 void list 上使用它时,它会返回

ghci> foldMap (Max . Just) []
Max {getMax = Nothing}

这就是我想要的,但是当我在没有元素的树上使用它时

ghci> foldMap (Max . Just) (Node [] [])
Max {getMax = Just []}

但我希望它返回 Nothing 而只是 []。它不适用于没有子节点的节点,但它适用于有价值的节点

ghci> foldMap (Max . Just) (Node 22 [Node 7 [Node 42 []], Node 18 [] ])
Max {getMax = Just 42}

有什么建议吗?

PD:我使用的是 ghci 7.10

【问题讨论】:

  • Node [] [] 不是一棵空树,它是一个没有子节点的单节点。
  • 你需要弄清楚你在说什么树类型。
  • 这个幺半群也可以在monoid-extras 中找到。如果您自己实现 Min 而不是使用此包,则会发出轻微警告:mappend (Min x) (Min y) = Min (min x y) 不太正确!

标签: haskell monoids


【解决方案1】:

Data.Tree 中的 Tree 类型不支持空树。问 GHCI Node [] [] 的类型是什么,你会发现是这样的:

Node [] [] :: a => Tree [a]

你的幺半群工作正常。

【讨论】:

  • 但不应该与没有元素的列表一样应用?
  • 这不是没有元素的树。那是一棵有一个元素的树,元素是[]
  • 我不认为你会有约束(而且a => Tree [a] 也会无效,因为a 在这种情况下不能成为约束,即使ConstraintKinds 已启用)
  • @DavidYoung:请注意那里没有课程。这只是一个疲惫的大脑思考forall a. 并改为写a =>
猜你喜欢
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2018-12-13
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多