天天看點

Haskell語言學習筆記(71)Semigroup

Semigroup

class Semigroup a where
        (<>) :: a -> a -> a
        sconcat :: NonEmpty a -> a
        stimes :: Integral b => b -> a -> a

class Semigroup a => Monoid a where
        mempty  :: a

        mappend :: a -> a -> a
        mappend = (<>)

        mconcat :: [a] -> a
        mconcat = foldr mappend mempty
           

半群(Semigroup)是個類型類,它是幺半群(Monoid)的基類。

Prelude Data.List.NonEmpty Data.Semigroup> Sum  <> Sum 
Sum {getSum = }
Prelude Data.List.NonEmpty Data.Semigroup> sconcat $ Sum  :| [Sum ]
Sum {getSum = }
Prelude Data.List.NonEmpty Data.Semigroup> [] <> []
[,]
Prelude Data.List.NonEmpty Data.Semigroup> sconcat $ [] :| [[]]
[,]
Prelude Data.List.NonEmpty Data.Semigroup> stimes  []
[,,]
Prelude Data.List.NonEmpty Data.Semigroup> ( :| []) <> ( :| [])
 :| [,,]
Prelude Data.List.NonEmpty Data.Semigroup> stimes  $  :| []
 :| [,,,,]
Prelude Data.List.NonEmpty Data.Semigroup> stimes  $ Sum 
Sum {getSum = }
           

運算符 <> 的實作與 Monoid 中的 mempty 同義。

sconcat a 将 NonEmpty 清單 a 中的各個元素用運算符 <> 連接配接起來。

stimes b a 将 a 重複 b 次,然後用運算符 <> 連接配接起來。