19

圏論の本を読んだだけで、それを haskell に適用することにしました。

著者はモノイドを次のように定義しています。

モノイドとは、2 項演算 *:LxL->L と、L 内の識別単位要素 u などを備えた集合 L です。

「リスト」構造をモノイドと見なすと、二項演算がconcatで単位がであることは明らかです[]

しかし、ここでの集合 M は何ですか? やってみL = {set of all lists}たけど「LはLなの?」と困ってしまうと思います。セットと同じ問題のようです。

それとも、何か間違ったことを考えていますか?

編集: @applicative が指摘したように、Haskell のリストはFree monoids と呼ばれるモノイドです!

4

2 に答える 2

29

「リストはモノイドです」と言う代わりに、「すべての型 a について、その型はモノイドです」と言う方が正確[a]です。したがって、特定のタイプaの場合、 L は になりますL = {set of all lists of as}。そしてその定義では、もちろん L はそれ自体を含むことはできません。

于 2012-10-17T04:35:30.467 に答える
4

どのタイプtでも、それを持つことができます

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

実際、これは「a 上の自由モノイド」として知られています。

于 2012-10-17T04:47:41.470 に答える