[Haskell-cafe] running and understanding a lifting program

Patrick Browne patrick.browne at dit.ie
Sun Oct 24 09:12:18 EDT 2010


hi,
I am trying to run and understand a lifting program from [1].
The program lifts points to moving points that vary their position over
time.
I made some effort to run the progrm but I do not know how to overide
the +,-,*,sqr, and sqrt from the Num class. Below is my current attempt.

I do not wish to change or imporve the code, rather I wish to understand
it as it stands and find out what needs to be added to get the outputs
shown below i.e. distance between points p1 and p2 --> 1.55  and the
distance between moving points mp1 and mp2  for time 2 ----> 5.83.


data Point = Point Float Float
data Line = Line Point Point
data Polygon = Polygon [Point]
type Time = Float

-- Functor Changing, which adds time parameter t to its input value.
-- For example, Changing Float indicates a changing floating number
(i.e. a function of time).
type Changing v = Time -> v

-- The abstract lifting functions
class Lifts a where
 lift0 :: a -> f a
 lift1 :: (a -> b) -> f a -> f b
 lift2 :: (a -> b -> c) -> f a -> f b -> f c


-- Not too sure about this,
instance Lifts Changing Float where
 lift0 a = \t -> a
 lift1 op a = \t -> op (a t)
 lift2 op a b = \t -> op (a t) op (b t)

class Number a where
  (+), (-), (*) :: a -> a -> a
  sqr, sqrt :: a -> a
  sqr a = a * a

-- The class point which support vector plus and minus as well as
-- distance operation is defined as follow
class Number s => Points p s where
 x, y :: p s -> s
 x (Point x1 y1) = x1
 y (Point x1 y1) = y1
 (+), (-) :: p s -> p s -> p s
 (+) a b = Point (x a + x b) (y a + y b)
 (-) a b = Point (x a - x b) (y a - y b)
 dist :: p s -> p s -> s
 dist a b = sqrt(sqr((x a)-(x b))+sqr((y a)-(y b)))


-- The lifting the operations for numbers shoukd provide a distance
-- function which can be used for both static and moving points:
instance Number v => Number (Changing v) where
 (+) = lift2 (+)
 (-) = lift2 (-)
 (*) = lift2 (*)
 sqrt = lift1 (sqrt)

-- Running the code
-- If p1 and p2 are two 2D static points,
-- their distance d is calculated as follows:
p1, p2 :: Point Float
p1 = Point 3.4 5.5
p2 = Point 4.5 4.5

-- distance between p1 and p2 --> 1.55
d = dist p1 p2

-- For 2D moving points mp1 and mp2, their distance md,
-- which is a function of time, is calculated as follows:
mp1, mp2 :: Point (Changing Float)
mp1 = Point (\t -> 4.0 + 0.5 * t)(\t -> 4.0 - 0.5 * t)
mp2 = Point (\t -> 0.0 + 1.0 * t)(\t -> 0.0 - 1.0 * t)
--  distance between mp1 and mp2
md = dist mp1 mp2
-- distance md for time 2 ----> 5.83
md 2


[1] A Mathematical Tool to Extend 2D Spatial Operations
to Higher Dimensions:  by Farid Karimipour1,2, Mahmoud R. Delavar1, and
Andrew U. Frank2

http://books.google.ie/books?id=JUGpGN_jwf0C&pg=PA153&lpg=PA153&dq=Karimipour+%22A+Mathematical+Tool+to+Extend+2D+Spatial+Operations+to+Higher+Dimensions%22&source=bl&ots=fu-lSkPMr3&sig=ztkcRV3Cv6hn9T6iwQCJ9sB75IM&hl=en&ei=QS7ETJHPGoiA5Ab0zZW6Aw&sa=X&oi=book_result&ct=result&resnum=4&ved=0CCMQ6AEwAw#v=onepage&q=Karimipour%20%22A%20Mathematical%20Tool%20to%20Extend%202D%20Spatial%20Operations%20to%20Higher%20Dimensions%22&f=false





This message has been scanned for content and viruses by the DIT Information Services E-Mail Scanning Service, and is believed to be clean. http://www.dit.ie


More information about the Haskell-Cafe mailing list