
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