Haskell 任意可折叠曲面上的幺半群

Haskell 任意可折叠曲面上的幺半群,haskell,monoids,Haskell,Monoids,我试图在haskell上创建一个幺半群的实例,这个幺半群可以应用于任何包含可比较元素并返回存储的最大值的可折叠结构 到目前为止,我有这个 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 O

我试图在haskell上创建一个幺半群的实例,这个幺半群可以应用于任何包含可比较元素并返回存储的最大值的可折叠结构

到目前为止,我有这个

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)
它在列表上运行良好,但在树上有一些问题。当我在无效列表中使用它时,它会返回

ghci> foldMap (Max . Just) []
Max {getMax = Nothing}
这就是我想要的,但是当我在没有元素的树上使用它时

ghci> foldMap (Max . Just) (Node [] [])
Max {getMax = Just []}
但我想它什么也不返回,只返回[]。它不适用于没有子节点的节点,但适用于有值节点

ghci> foldMap (Max . Just) (Node 22 [Node 7 [Node 42 []], Node 18 [] ])
Max {getMax = Just 42}
有什么建议吗


PD:我正在使用ghci 7.10在
数据中键入
。树
不支持空树。询问GHCI节点[][]的类型是什么,您会发现如下内容:

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

您的monoid工作正常。

树键入
数据。树
不支持空树。询问GHCI节点[][]的类型是什么,您会发现如下内容:

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

你的monoid工作正常。

节点[][]
不是一个空树,它是一个没有子节点的单个节点。你需要澄清这是什么树类型。此monoid在中也可用。如果您自己实现
Min
而不是使用此包,则会出现一个轻微警告:
mappend(minx)(miny)=Min(minxy)
不太正确<代码>节点[]【】不是空树,它是一个没有子节点的单个节点。您需要澄清这是什么树类型。此幺半群在中也可用。如果您自己实现
Min
而不是使用此包,则会出现一个轻微警告:
mappend(minx)(miny)=Min(minxy)
不太正确!但是不应该应用与没有元素的列表相同的方法吗?这不是没有元素的树。这是一个只有一个元素的树,元素是
[]
。我认为您不会有约束(而且
a=>tree[a]
将是无效的,因为
a
在这个上下文中不能是约束,即使启用了
约束种类
)@DavidYoung:注意,这里没有类。这只是一个疲惫的大脑在思考所有a.并编写
a=>
来代替。但不应该将其应用于没有元素的列表?这不是一个没有元素的树。这是一个只有一个元素的树,元素是
[]
。我认为您不会有约束(而且
a=>tree[a]
将是无效的,因为
a
在这个上下文中不能是约束,即使启用了
约束种类
)@DavidYoung:注意,这里没有类。那只不过是一个疲惫的大脑在思考所有a.的问题,然后写
a=>