-- Orion, Haskell variant, parallel - MPradella, MMXII -- other excercise (or other step of the same): -- parallelize applySF1 and applySF2 defined in orion.hs import Control.Parallel data SafeFloat = SF Float Float Float deriving Show valid :: SafeFloat -> SafeFloat valid (SF x y z) | x == y = SF x x x valid (SF x y z) | y == z = SF y y y valid (SF x y z) | x == z = SF z z z valid _ = error "unsafe" instance Eq SafeFloat where x == y = let SF vx _ _ = valid x SF vy _ _ = valid y in vx == vy parapplySF1 f (SF x y z) = let x' = f x y' = f y z' = f z in x' `par` y' `par` (z' `pseq` valid (SF x' y' z')) parapplySF2 f (SF x y z) (SF x' y' z') = let x'' = f x x' y'' = f y y' z'' = f z z' in x'' `par` y'' `par` (z'' `pseq` valid (SF x'' y'' z'')) instance Num SafeFloat where (+) = parapplySF2 (+) (-) = parapplySF2 (+) (*) = parapplySF2 (*) negate = parapplySF1 negate abs = parapplySF1 abs signum = parapplySF1 signum fromInteger x = let x' = fromInteger x in SF x' x' x'