--
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat deriving Eq valday 0 = Sun valday 1 = Mon valday 2 = Tue valday 3 = Wed valday 4 = Thu valday 5 = Fri valday 6 = Sat dayvalA x = case x of Sun -> 0 Mon -> 1 Tue -> 2 Wed -> 3 ; Thu -> 4 ; Fri -> 5 Sat -> 6 dayval Sun = 0 dayval Mon = 1 dayval Tue = 2 dayval Wed = 3 dayval Thu = 4 dayval Fri = 5 dayval Sat = 6 dayvalB :: Day -> Int dayvalB x = let (d,n) = head (filter (\(d,n)->d==x) (zip [Sun,Mon,Tue,Wed,Thu,Fri,Sat] [0..])) in n dayafter d = valday (((dayval d) + 1) `mod` 7) data Move = Paper | Rock | Scissors beats :: Move -> Move beats Paper = Scissors beats Rock = Paper beats Scissors = Rock -- data Bool = True | False data Direction = North | East | South | West data Tagger = Tagn Int | Tagb Bool number (Tagn n) = n boolean (Tagb b) = b isNum (Tagn _) = True isNum (Tagb _) = False data Temp = Celsius Float | Fahrenheit Float | Kelvin Float toKelvin :: Temp -> Temp toKelvin (Celsius c) = Kelvin(c + 272.0) toKelvin (Fahrenheit f) = Kelvin( (f - 32.0) * (5.0/9.0) + 272.0 ) toKelvin (Kelvin k) = Kelvin k data Shape = Rectangle Float Float | Ellipse Float Float | RtTriangle Float Float | Polygon [ (Float,Float) ] deriving Show circle radius = Ellipse radius radius square side = Rectangle side side area :: Shape -> Float area (Rectangle s1 s2) = s1 * s2 area (Ellipse r1 r2) = pi * r1 * r2 area (RtTriangle s1 s2) = (s1 *s2) / 2 area (Polygon (v1:pts)) = polyArea pts where polyArea :: [ (Float,Float) ] -> Float polyArea (v2 : v3 : vs) = triArea v1 v2 v3 + polyArea (v3:vs) polyArea _ = 0 triArea v1 v2 v3 = let a = distBetween v1 v2 b = distBetween v2 v3 c = distBetween v3 v1 s = 0.5*(a+b+c) in sqrt (s*(s-a)*(s-b)*(s-c)) distBetween (x1,y1) (x2,y2) = sqrt ((x1-x2)^2 + (y1-y2)^2) --