{-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
module F2 ( VarF2
, PolF2
, unbox ) where
import Haskell4Maths ( Vect
, Lex
, F2
, var)
import Test.QuickCheck ( Arbitrary
, Gen
, arbitrary
, vectorOf
, choose
, quickCheck)
type PolF2 = Vect F2 (Lex String)
instance Arbitrary PolF2 where
arbitrary = polGen
newtype VarF2 = Box (Vect F2 (Lex String))
deriving (Eq, Ord)
unbox :: VarF2 -> PolF2
unbox (Box x) = x
instance Show VarF2 where
show = show . unbox
instance Arbitrary VarF2 where
arbitrary = varGen
varGen :: Gen VarF2
varGen = do
n <- choose ((1::Int),100)
return (Box (var ('x':(show n))))
varExpGen :: Gen (PolF2,Int)
varExpGen = do
Box x <- varGen
i <- choose ((1::Int),5)
return $ (x,i)
monGen :: Gen PolF2
monGen = do
n <- choose ((1::Int),5)
xs <- vectorOf n varExpGen
return $ product [ x ^ i | (x,i) <- xs]
polGen :: Gen PolF2
polGen = do
n <- choose ((1::Int),5)
xs <- vectorOf n monGen
return $ sum xs