不应该说“列表是一个Monoid”,更准确的说法是“对于所有类型a,类型[a]
是一个Monoid”。因此,任何特定类型a
,你的L将是L = {所有as列表的集合}
。根据这个定义,显然L不能包含自己。
[a]
(例如“一个由 a
组成的列表”),而不是值 [a]
(例如“包含一个名为 a
的单个元素的列表”)。 - sepp2k〈abc〉
。 - Tikhon Jelvisinstance Monoid [a]
使用了一个普适量词 a
,所以它实际上是 forall a. instance Monoid [a]
。稍加调整后,这就非常接近于“对于所有类型 a
,类型 [a]
是一个 Monoid”。 - John Lt
,您都可以具有以下内容L = all elements of the type [t]
使用++
,L以平凡的方式成为一个单子。实际上,我们在Haskell中正式化了这一点。
class Monoid m where
mempty :: m
mappend :: m -> m -> m
这是一种“类”,具有必要的操作来形成一个幺半群,因此
instance Monoid [a] where
mempty = []
mappend a b = a ++ b
L={t1, t2, ...}
还是L={{t1}, {t1, t2},...}
?(其中t1,t2..
的类型为t
) - Andriy Drozdyukt = Bool
,那么L = { [], [False], [True], [False, False], [False, True], [True, False], [True, True], ... }
。(严格来说,您可能还想包括底部)。 - hammarmappend (repeat True) (repeat False)
是完全合法的。 - John L
concat :: [[a]] -> [a]
,还是(++) :: [a] -> [a] -> [a]
?实际上前者是一种单子操作,但这是相当晦涩的... - Ben Millwoodconcat :: [[a]] -> [a]
如何成为一个幺半群操作? - baxbaxwalanuksiweconcat
是列表单子的join
操作的想法,这在某种意义上是一种单调操作,将函子List . List
转换为函子List
。 - Ben Millwood