module Chapter9 where
import Prelude hiding (sum,length,(++),reverse,unzip)
import Test.QuickCheck
mysteryMax :: Integer -> Integer -> Integer -> Integer
mysteryMax :: Integer -> Integer -> Integer -> Integer
mysteryMax Integer
x Integer
y Integer
z
| Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
y Bool -> Bool -> Bool
&& Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
z = Integer
x
| Integer
y Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
x Bool -> Bool -> Bool
&& Integer
y Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
z = Integer
y
| Bool
otherwise = Integer
z
prop_mystery :: Integer -> Integer -> Integer -> Bool
prop_mystery :: Integer -> Integer -> Integer -> Bool
prop_mystery Integer
x Integer
y Integer
z =
Integer -> Integer -> Integer -> Integer
mysteryMax Integer
x Integer
y Integer
z Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== (Integer
x Integer -> Integer -> Integer
forall a. Ord a => a -> a -> a
`max` Integer
y) Integer -> Integer -> Integer
forall a. Ord a => a -> a -> a
`max` Integer
z
fact :: Integer -> Integer
fact :: Integer -> Integer
fact Integer
n
| Integer
nInteger -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
==Integer
0 = Integer
1
| Bool
otherwise = Integer
n Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer -> Integer
fact (Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
1)
posInts :: [Integer]
posInts :: [Integer]
posInts = [Integer
1, Integer
2 .. ]
sum :: [Integer] -> Integer
sum :: [Integer] -> Integer
sum [] = Integer
0
sum (Integer
x:[Integer]
xs) = Integer
x Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ [Integer] -> Integer
sum [Integer]
xs
doubleAll :: [Integer] -> [Integer]
doubleAll :: [Integer] -> [Integer]
doubleAll [] = []
doubleAll (Integer
z:[Integer]
zs) = Integer
2Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
z Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Integer] -> [Integer]
doubleAll [Integer]
zs
prop_SumDoubleAll :: [Integer] -> Bool
prop_SumDoubleAll :: [Integer] -> Bool
prop_SumDoubleAll [Integer]
xs =
[Integer] -> Integer
sum ([Integer] -> [Integer]
doubleAll [Integer]
xs) Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
2 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* [Integer] -> Integer
sum [Integer]
xs
length :: [a] -> Int
length :: forall a. [a] -> Int
length [] = Int
0
length (a
z:[a]
zs) = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [a] -> Int
forall a. [a] -> Int
length [a]
zs
(++) :: [a] -> [a] -> [a]
[] ++ :: forall a. [a] -> [a] -> [a]
++ [a]
zs = [a]
zs
(a
w:[a]
ws) ++ [a]
zs = a
wa -> [a] -> [a]
forall a. a -> [a] -> [a]
:([a]
ws[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
zs)
prop_lengthPlusPlus :: [a] -> [a] -> Bool
prop_lengthPlusPlus :: forall a. [a] -> [a] -> Bool
prop_lengthPlusPlus [a]
xs [a]
ys =
[a] -> Int
forall a. [a] -> Int
length ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
ys) Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [a] -> Int
forall a. [a] -> Int
length [a]
xs Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [a] -> Int
forall a. [a] -> Int
length [a]
ys
reverse :: [a] -> [a]
reverse :: forall a. [a] -> [a]
reverse [] = []
reverse (a
z:[a]
zs) = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
zs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
z]
prop_reversePlusPlus' :: Eq a => [a] -> [a] -> Bool
prop_reversePlusPlus' :: forall a. Eq a => [a] -> [a] -> Bool
prop_reversePlusPlus' [a]
xs [a]
ys =
[a] -> [a]
forall a. [a] -> [a]
reverse ([a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a]
ys) [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== [a] -> [a]
forall a. [a] -> [a]
reverse [a]
xs [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
ys
prop_reversePlusPlusOops :: [Integer] -> [Integer] -> Bool
prop_reversePlusPlusOops :: [Integer] -> [Integer] -> Bool
prop_reversePlusPlusOops [Integer]
xs [Integer]
ys =
[Integer] -> [Integer]
forall a. [a] -> [a]
reverse ([Integer]
xs [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
ys) [Integer] -> [Integer] -> Bool
forall a. Eq a => a -> a -> Bool
== [Integer] -> [Integer]
forall a. [a] -> [a]
reverse [Integer]
xs [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer] -> [Integer]
forall a. [a] -> [a]
reverse [Integer]
ys
prop_reversePlusPlus :: [Integer] -> [Integer] -> Bool
prop_reversePlusPlus :: [Integer] -> [Integer] -> Bool
prop_reversePlusPlus [Integer]
xs [Integer]
ys =
[Integer] -> [Integer]
forall a. [a] -> [a]
reverse ([Integer]
xs [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
ys) [Integer] -> [Integer] -> Bool
forall a. Eq a => a -> a -> Bool
== [Integer] -> [Integer]
forall a. [a] -> [a]
reverse [Integer]
ys [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer] -> [Integer]
forall a. [a] -> [a]
reverse [Integer]
xs
prop_assocPlusPlus :: [Integer] -> [Integer] -> [Integer] -> Bool
prop_assocPlusPlus :: [Integer] -> [Integer] -> [Integer] -> Bool
prop_assocPlusPlus [Integer]
xs [Integer]
ys [Integer]
zs =
([Integer]
xs [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
ys) [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
zs [Integer] -> [Integer] -> Bool
forall a. Eq a => a -> a -> Bool
== [Integer]
xs [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ ([Integer]
ys [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
zs)
unzip :: [(a,b)] -> ([a],[b])
unzip :: forall a b. [(a, b)] -> ([a], [b])
unzip [] = ([],[])
unzip ((a
x,b
y):[(a, b)]
ps)
= (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs,b
yb -> [b] -> [b]
forall a. a -> [a] -> [a]
:[b]
ys)
where
([a]
xs,[b]
ys) = [(a, b)] -> ([a], [b])
forall a b. [(a, b)] -> ([a], [b])
unzip [(a, b)]
ps
shunt :: [a] -> [a] -> [a]
shunt :: forall a. [a] -> [a] -> [a]
shunt [] [a]
ys = [a]
ys
shunt (a
x:[a]
xs) [a]
ys = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
shunt [a]
xs (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
prop_shunt :: [Integer] -> [Integer] -> Bool
prop_shunt :: [Integer] -> [Integer] -> Bool
prop_shunt [Integer]
xs [Integer]
zs =
[Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
shunt ([Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
shunt [Integer]
xs [Integer]
zs) [] [Integer] -> [Integer] -> Bool
forall a. Eq a => a -> a -> Bool
== [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
shunt [Integer]
zs [Integer]
xs
rev :: [a] -> [a]
rev :: forall a. [a] -> [a]
rev [a]
xs = [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
shunt [a]
xs []
prop_reverses :: [Integer] -> Bool
prop_reverses :: [Integer] -> Bool
prop_reverses [Integer]
xs =
[Integer] -> [Integer]
forall a. [a] -> [a]
reverse [Integer]
xs [Integer] -> [Integer] -> Bool
forall a. Eq a => a -> a -> Bool
== [Integer] -> [Integer]
forall a. [a] -> [a]
rev [Integer]
xs
fac2 :: Integer -> Integer
fac2 :: Integer -> Integer
fac2 Integer
n = Integer -> Integer -> Integer
facAux Integer
n Integer
1
facAux :: Integer -> Integer -> Integer
facAux :: Integer -> Integer -> Integer
facAux Integer
0 Integer
p = Integer
p
facAux Integer
n Integer
p = Integer -> Integer -> Integer
facAux (Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
1) (Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
p)
prop_facs' :: Integer -> Bool
prop_facs' :: Integer -> Bool
prop_facs' Integer
x =
Integer -> Integer
fact Integer
x Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer -> Integer
fac2 Integer
x
prop_facs :: Integer -> Bool
prop_facs :: Integer -> Bool
prop_facs Integer
x =
(Integer
xInteger -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<Integer
0) Bool -> Bool -> Bool
|| Integer -> Integer
fact Integer
x Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer -> Integer
fac2 Integer
x