liquidhaskell-0.8.10.7: typeclass-tests/Data/Num/Semigroup.hs
{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple" @-}
{-@ LIQUID "--aux-inline" @-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Num.Semigroup where
import Prelude hiding ( Functor(..)
, Applicative(..)
, Monad(..)
, Foldable(..)
, Maybe(..)
, Monoid(..)
, Semigroup(..)
, Either(..)
, id
, flip
, const
, apply
)
import Liquid.ProofCombinators
import Data.Semigroup.Classes
import Data.List.NonEmpty
import Data.List
data Sum a = Sum {getSum :: a}
instance Num a => Semigroup (Sum a) where
mappend (Sum x) (Sum y) = Sum $ x + y
sconcat (NonEmpty h t) = foldlList mappend h t
instance Num a => VSemigroup (Sum a) where
lawAssociative _ _ _ = ()
lawSconcat _ = ()
instance Num a => Monoid (Sum a) where
mempty = Sum 0
mconcat = foldrList mappend mempty
data Product a = Product {getProduct :: a}
instance Num a => Semigroup (Product a) where
mappend (Product x) (Product y) = Product $ x * y
sconcat (NonEmpty h t) = foldlList mappend h t
instance Num a => VSemigroup (Product a) where
lawAssociative _ _ _ = ()
lawSconcat _ = ()
instance Num a => Monoid (Product a) where
mempty = Product 1
mconcat = foldlList mappend mempty