群を表すHaskellのコード

Group.hs

module Group
  ( Group
  , gappend
  , gempty
  , ginv
  , grpLawAp
  , grpLawEm
  , grpLawInv
  ) where

-- 群型クラス
class Group a where
  gappend :: a -> a -> a
  gempty  :: a
  ginv    :: a -> a  -- inverse

-- 結合律
grpLawAp :: (Group a, Eq a) => a -> a -> a -> Bool
grpLawAp x y z = (x `gappend` y) `gappend` z == x `gappend` (y `gappend` z)

-- 単位元律
grpLawEm :: (Group a, Eq a) => a -> Bool
grpLawEm x =
  let left  = gempty `gappend` x
      right = x `gappend` gempty
  in left == right && right == x

-- 逆元の存在
grpLawInv :: (Group a, Eq a) => a -> Bool
grpLawInv x =
  let left  = x `gappend` (ginv x)
      right = (ginv x) `gappend` x
  in left == right && right == gempty

GroupTest.hs

import Group
import Test.QuickCheck

-- 群インスタンスの例
instance Group Int where
  gappend = (+)
  gempty  = 0
  ginv    = negate


-- 任意の元が法則を満たすことのテスト
grpTestAp :: IO ()
grpTestAp = let grpLawAp' = grpLawAp :: Int -> Int -> Int -> Bool
            in quickCheck grpLawAp'

grpTestEm :: IO ()
grpTestEm = let grpLawEm' = grpLawEm :: Int -> Bool
            in quickCheck grpLawEm'

grpTestInv :: IO ()
grpTestInv = let grpLawInv' = grpLawInv :: Int -> Bool
             in quickCheck grpLawInv'

長いですね。
少しずつ見ていきましょう。