2012年3月23日星期五

SICP exercises in Haskell (Section 2.1.2)


-- Section 2.1.2                
-- Exercise 2.2
type Point = (Float, Float)
make_point :: Float -> Float -> Point
make_point x y = (x, y)


x_point :: Point -> Float
x_point = fst


y_point :: Point -> Float
y_point = snd


print_point :: Point -> String
print_point p = "(" ++ (show $ x_point p)
                ++ "," ++ (show $ y_point p)
                ++ ")"
                
type Segment = (Point, Point)
make_segment :: Point -> Point -> Segment
make_segment p1 p2 = (p1, p2)


start_segment :: Segment -> Point
start_segment = fst


end_segment :: Segment -> Point
end_segment = snd


midpoint_segment :: Segment -> Point
midpoint_segment s = make_point ((x1 + x2) / 2) ((y1 + y2) / 2)
  where x1 = x_point p1
        x2 = x_point p2
        y1 = y_point p1
        y2 = y_point p2
        p1 = start_segment s
        p2 = end_segment s




-- Exercise 2.3
data Rectangle = DiagonalLine Segment
               | DiagonalPoint Point Point
               deriving (Show)


width_rectangle :: Rectangle -> Float
width_rectangle (DiagonalLine seg) = abs (x2 - x1)
  where p1 = start_segment seg
        p2 = end_segment seg
        x1 = x_point p1
        x2 = x_point p2        
width_rectangle (DiagonalPoint p1 p2) = abs (x2 - x1)
  where x1 = x_point p1
        x2 = x_point p2
        
height_rectangle :: Rectangle -> Float        
height_rectangle (DiagonalLine seg) = abs (y2 - y1)
  where p1 = start_segment seg
        p2 = end_segment seg
        y1 = y_point p1
        y2 = y_point p2
height_rectangle (DiagonalPoint p1 p2) = abs (y2 - y1)        
  where y1 = y_point p1
        y2 = y_point p2
        
perimeter_rectangle :: Rectangle -> Float        
perimeter_rectangle rec = 2 * (height_rectangle rec 
                               + width_rectangle rec)
                          
area_rectangle :: Rectangle -> Float
area_rectangle rec = height_rectangle rec * width_rectangle rec
        

没有评论:

发表评论