fork download
  1. import System.IO
  2. import GHC.Read
  3. import Text.ParserCombinators.ReadPrec (lift,(<++))
  4. import Text.ParserCombinators.ReadP (skipSpaces,skipMany,get)
  5.  
  6. mnk :: [Double] -> [Double] -> (Double,Double,Double)
  7. mnk x y = (a,b,sigm)
  8. where n = length x
  9. sx = sum x
  10. sy = sum y
  11. sx2 = sum $ map (^(2 :: Int)) x
  12. sxy = sum $ zipWith (*) x y
  13. det = sx2*(fromIntegral n)-sx*sx
  14. deta = (fromIntegral n)*sxy-sx*sy
  15. detb = sx2*sy-sx*sxy
  16. a = deta/det
  17. b = detb/det
  18. sigm = sum $ zipWith (\xi yi -> (yi - (a*xi+b))^(2 :: Int)) x y
  19.  
  20.  
  21. data InputData = XY Double Double
  22. | Complete
  23.  
  24. instance GHC.Read.Read InputData where
  25.  
  26. readPrec = (do
  27. x <- readPrec
  28. lift skipSpaces
  29. y <- readPrec
  30. return (XY x y))
  31.  
  32. <++ (do
  33. lift $ skipMany get
  34. return Complete)
  35.  
  36.  
  37. main :: IO ()
  38. main = do
  39. hSetBuffering stdout NoBuffering
  40. let dataInput i xs ys = do
  41. let strI = show i
  42. putStr $ "Enter x" ++ strI ++ " y" ++ strI ++
  43. " or not a number to complete : "
  44. inp <- readLn
  45. case inp of
  46. (XY x y) -> dataInput (i+1) (xs++[x]) (ys++[y])
  47. Complete -> return (xs,ys)
  48. (xs,ys) <- dataInput (0 :: Int) [] []
  49. if length xs < 2 then putStrLn "no data"
  50. else do
  51. let (a,b,sigm) = mnk xs ys
  52. putStrLn $ "\na=" ++ show a
  53. putStrLn $ "b=" ++ show b
  54. putStrLn $ "sigm=" ++ show sigm
  55.  
Success #stdin #stdout 0s 4312KB
stdin
1 3
2 5
3 7
4 9
5 11
6 13

stdout
Enter x0 y0 or not a number to complete : Enter x1 y1 or not a number to complete : Enter x2 y2 or not a number to complete : Enter x3 y3 or not a number to complete : Enter x4 y4 or not a number to complete : Enter x5 y5 or not a number to complete : Enter x6 y6 or not a number to complete : 
a=2.0
b=1.0
sigm=0.0