module Chapter13 where
import Data.List
import Chapter5 (Shape(..),area)
elemBool :: Bool -> [Bool] -> Bool
elemBool :: Bool -> [Bool] -> Bool
elemBool Bool
x [] = Bool
False
elemBool Bool
x (Bool
y:[Bool]
ys)
= (Bool
x Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== Bool
y) Bool -> Bool -> Bool
|| Bool -> [Bool] -> Bool
elemBool Bool
x [Bool]
ys
elemGen :: (a -> a -> Bool) -> a -> [a] -> Bool
elemGen :: forall a. (a -> a -> Bool) -> a -> [a] -> Bool
elemGen a -> a -> Bool
eqFun a
x [] = Bool
False
elemGen a -> a -> Bool
eqFun a
x (a
y:[a]
ys)
= (a -> a -> Bool
eqFun a
x a
y) Bool -> Bool -> Bool
|| (a -> a -> Bool) -> a -> [a] -> Bool
forall a. (a -> a -> Bool) -> a -> [a] -> Bool
elemGen a -> a -> Bool
eqFun a
x [a]
ys
allEqual :: Eq a => a -> a -> a -> Bool
allEqual :: forall a. Eq a => a -> a -> a -> Bool
allEqual a
m a
n a
p = (a
ma -> a -> Bool
forall a. Eq a => a -> a -> Bool
==a
n) Bool -> Bool -> Bool
&& (a
na -> a -> Bool
forall a. Eq a => a -> a -> Bool
==a
p)
suc :: Integer -> Integer
suc = (Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1)
lookupFirst :: Eq a => [ (a,b) ] -> a -> [b]
lookupFirst :: forall a b. Eq a => [(a, b)] -> a -> [b]
lookupFirst [(a, b)]
ws a
x
= [ b
z | (a
y,b
z) <- [(a, b)]
ws , a
ya -> a -> Bool
forall a. Eq a => a -> a -> Bool
==a
x ]
class Info a where
examples :: [a]
size :: a -> Int
size a
_ = Int
1
instance Info Int where
examples :: [Int]
examples = [-Int
100..Int
100]
instance Info Char where
examples :: [Char]
examples = [Char
'a',Char
'A',Char
'z',Char
'Z',Char
'0',Char
'9']
instance Info Bool where
examples :: [Bool]
examples = [Bool
True,Bool
False]
instance Info Shape where
examples :: [Shape]
examples = [ Float -> Shape
Circle Float
3.0, Float -> Float -> Shape
Rectangle Float
45.9 Float
87.6 ]
size :: Shape -> Int
size = Float -> Int
forall b. Integral b => Float -> b
forall a b. (RealFrac a, Integral b) => a -> b
round (Float -> Int) -> (Shape -> Float) -> Shape -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Shape -> Float
area
instance Info a => Info [a] where
examples :: [[a]]
examples = [ [] ] [[a]] -> [[a]] -> [[a]]
forall a. [a] -> [a] -> [a]
++ [ [a
x] | a
x<-[a]
forall a. Info a => [a]
examples ] [[a]] -> [[a]] -> [[a]]
forall a. [a] -> [a] -> [a]
++ [ [a
x,a
y] | a
x<-[a]
forall a. Info a => [a]
examples , a
y<-[a]
forall a. Info a => [a]
examples ]
size :: [a] -> Int
size = (Int -> Int -> Int) -> Int -> [Int] -> Int
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) Int
1 ([Int] -> Int) -> ([a] -> [Int]) -> [a] -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Int) -> [a] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map a -> Int
forall a. Info a => a -> Int
size
instance (Info a,Info b) => Info (a,b) where
examples :: [(a, b)]
examples = [ (a
x,b
y) | a
x<-[a]
forall a. Info a => [a]
examples , b
y<-[b]
forall a. Info a => [a]
examples ]
size :: (a, b) -> Int
size (a
x,b
y) = a -> Int
forall a. Info a => a -> Int
size a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ b -> Int
forall a. Info a => a -> Int
size b
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
iSort :: Ord a => [a] -> [a]
iSort :: forall a. Ord a => [a] -> [a]
iSort [] = []
iSort (a
x:[a]
xs) = a -> [a] -> [a]
forall a. Ord a => a -> [a] -> [a]
ins a
x ([a] -> [a]
forall a. Ord a => [a] -> [a]
iSort [a]
xs)
ins :: Ord a => a -> [a] -> [a]
ins :: forall a. Ord a => a -> [a] -> [a]
ins a
x [] = [a
x]
ins a
x (a
y:[a]
ys)
| a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y = a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:(a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
| Bool
otherwise = a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: a -> [a] -> [a]
forall a. Ord a => a -> [a] -> [a]
ins a
x [a]
ys
vSort :: (Ord a,Show a) => [a] -> String
vSort :: forall a. (Ord a, Show a) => [a] -> [Char]
vSort = [a] -> [Char]
forall a. Show a => a -> [Char]
show ([a] -> [Char]) -> ([a] -> [a]) -> [a] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Ord a => [a] -> [a]
iSort
vLookupFirst :: (Eq a,Show b) => [(a,b)] -> a -> String
vLookupFirst :: forall a b. (Eq a, Show b) => [(a, b)] -> a -> [Char]
vLookupFirst [(a, b)]
xs a
x = [b] -> [Char]
forall a. Show a => a -> [Char]
show ([(a, b)] -> a -> [b]
forall a b. Eq a => [(a, b)] -> a -> [b]
lookupFirst [(a, b)]
xs a
x)
class (Ord a,Show a) => OrdVis a
class Checkable b where
infoCheck :: (Info a) => (a -> b) -> Bool
instance Checkable Bool where
infoCheck :: forall a. Info a => (a -> Bool) -> Bool
infoCheck a -> Bool
property = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ((a -> Bool) -> [a] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map a -> Bool
property [a]
forall a. Info a => [a]
examples)
instance (Info a, Checkable b) => Checkable (a -> b) where
infoCheck :: forall a. Info a => (a -> a -> b) -> Bool
infoCheck a -> a -> b
property = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ((a -> Bool) -> [a] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> b) -> Bool
forall b a. (Checkable b, Info a) => (a -> b) -> Bool
forall a. Info a => (a -> b) -> Bool
infoCheck((a -> b) -> Bool) -> (a -> a -> b) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> a -> b
property) [a]
forall a. Info a => [a]
examples)
test0 :: Bool
test0 = (Int -> Bool) -> Bool
forall b a. (Checkable b, Info a) => (a -> b) -> Bool
forall a. Info a => (a -> Bool) -> Bool
infoCheck (\Int
x -> (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=(Int
0::Int) Bool -> Bool -> Bool
|| Int
xInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
0))
test1 :: Bool
test1 = (Int -> Int -> Bool) -> Bool
forall b a. (Checkable b, Info a) => (a -> b) -> Bool
forall a. Info a => (a -> Int -> Bool) -> Bool
infoCheck (\Int
x Int
y -> (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=(Int
0::Int) Bool -> Bool -> Bool
|| Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
x))
test2 :: Bool
test2 = (Int -> Int -> Bool) -> Bool
forall b a. (Checkable b, Info a) => (a -> b) -> Bool
forall a. Info a => (a -> Int -> Bool) -> Bool
infoCheck (\Int
x Int
y -> (Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=(Int
0::Int) Bool -> Bool -> Bool
|| Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
y Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
x))
prodFun :: (t -> t1) -> (t -> t2) -> t -> (t1,t2)
prodFun :: forall t t1 t2. (t -> t1) -> (t -> t2) -> t -> (t1, t2)
prodFun t -> t1
f t -> t2
g = \t
x -> (t -> t1
f t
x, t -> t2
g t
x)
example1 :: Int
example1 = Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
'c' Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
3
f :: (a, Char) -> (a, [Char])
f (a
x,Char
y) = (a
x , [Char
'a' .. Char
y])
g :: (Int, t a) -> Int
g (Int
m,t a
zs) = Int
m Int -> Int -> Int
forall a. Num a => a -> a -> a
+ t a -> Int
forall a. t a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length t a
zs
h :: (Int, Char) -> Int
h = (Int, [Char]) -> Int
forall {t :: * -> *} {a}. Foldable t => (Int, t a) -> Int
g ((Int, [Char]) -> Int)
-> ((Int, Char) -> (Int, [Char])) -> (Int, Char) -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Char) -> (Int, [Char])
forall {a}. (a, Char) -> (a, [Char])
f
expr :: Int
expr :: Int
expr = [Bool] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([][Bool] -> [Bool] -> [Bool]
forall a. [a] -> [a] -> [a]
++[Bool
True]) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [Integer] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([][Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++[Integer
2,Integer
3,Integer
4])
member :: Eq a => [a] -> a -> Bool
member :: forall a. Eq a => [a] -> a -> Bool
member [] a
y = Bool
False
member (a
x:[a]
xs) a
y = (a
xa -> a -> Bool
forall a. Eq a => a -> a -> Bool
==a
y) Bool -> Bool -> Bool
|| [a] -> a -> Bool
forall a. Eq a => [a] -> a -> Bool
member [a]
xs a
y
merge :: [a] -> [a] -> [a]
merge (a
x:[a]
xs) (a
y:[a]
ys)
| a
xa -> a -> Bool
forall a. Ord a => a -> a -> Bool
<a
y = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
merge [a]
xs (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
| a
xa -> a -> Bool
forall a. Eq a => a -> a -> Bool
==a
y = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
merge [a]
xs [a]
ys
| Bool
otherwise = a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a] -> [a] -> [a]
merge (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs) [a]
ys
merge (a
x:[a]
xs) [] = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
merge [] (a
y:[a]
ys) = (a
ya -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
merge [] [] = []