From b8b5dd1d2b657c726de815cd61e687b5da88fbad Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 14 Nov 2024 19:53:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=B2=20fern.hs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/fern/fern.hs | 32 ++++++++--------- .../{fern_simple.hs => fern_with_monads.hs} | 34 +++++++++++-------- 2 files changed, 34 insertions(+), 32 deletions(-) rename lab2/fern/{fern_simple.hs => fern_with_monads.hs} (50%) diff --git a/lab2/fern/fern.hs b/lab2/fern/fern.hs index b348f84..863dd51 100644 --- a/lab2/fern/fern.hs +++ b/lab2/fern/fern.hs @@ -1,4 +1,4 @@ -import System.Random (randomRIO) +import System.Random (StdGen, mkStdGen, randomR) type Point = (Float, Float) @@ -21,22 +21,20 @@ applyTransformation point random | random < 0.93 = transformation3 point | otherwise = transformation4 point -genNextPoint :: Point -> IO Point -genNextPoint point = do - random <- randomRIO (0.0, 1.0 :: Float) - return $ applyTransformation point random +genNextPoint :: StdGen -> Point -> (Point, StdGen) +genNextPoint gen point = + let (random, newGen) = randomR (0.0, 1.0 :: Float) gen + in (applyTransformation point random, newGen) -barnsleyFern :: Point -> Int -> IO [Point] -barnsleyFern _ 0 = return [] -barnsleyFern startPoint n = do - x' <- genNextPoint startPoint - xs <- barnsleyFern x' (n - 1) - return (startPoint : xs) +barnsleyFern :: StdGen -> Point -> Int -> [Point] +barnsleyFern _ _ 0 = [] +barnsleyFern gen startPoint n = + let (nextPoint, newGen) = genNextPoint gen startPoint + in startPoint : barnsleyFern newGen nextPoint (n - 1) + + +n = 1000 +randomSeed = 17 main :: IO () -main = do - putStrLn "Укажите количество шагов рекурсии:" - input <- getLine - let n = read input :: Int - fractal <- barnsleyFern (0, 0) n - print fractal \ No newline at end of file +main = print $ barnsleyFern (mkStdGen randomSeed) (0, 0) n diff --git a/lab2/fern/fern_simple.hs b/lab2/fern/fern_with_monads.hs similarity index 50% rename from lab2/fern/fern_simple.hs rename to lab2/fern/fern_with_monads.hs index 863dd51..0b62b5f 100644 --- a/lab2/fern/fern_simple.hs +++ b/lab2/fern/fern_with_monads.hs @@ -1,4 +1,6 @@ -import System.Random (StdGen, mkStdGen, randomR) +-- Не стоит в первой же лабе использовать монады, можно и без них + +import System.Random (randomRIO) type Point = (Float, Float) @@ -21,20 +23,22 @@ applyTransformation point random | random < 0.93 = transformation3 point | otherwise = transformation4 point -genNextPoint :: StdGen -> Point -> (Point, StdGen) -genNextPoint gen point = - let (random, newGen) = randomR (0.0, 1.0 :: Float) gen - in (applyTransformation point random, newGen) +genNextPoint :: Point -> IO Point +genNextPoint point = do + random <- randomRIO (0.0, 1.0 :: Float) + return $ applyTransformation point random -barnsleyFern :: StdGen -> Point -> Int -> [Point] -barnsleyFern _ _ 0 = [] -barnsleyFern gen startPoint n = - let (nextPoint, newGen) = genNextPoint gen startPoint - in startPoint : barnsleyFern newGen nextPoint (n - 1) - - -n = 1000 -randomSeed = 17 +barnsleyFern :: Point -> Int -> IO [Point] +barnsleyFern _ 0 = return [] +barnsleyFern startPoint n = do + x' <- genNextPoint startPoint + xs <- barnsleyFern x' (n - 1) + return (startPoint : xs) main :: IO () -main = print $ barnsleyFern (mkStdGen randomSeed) (0, 0) n +main = do + putStrLn "Укажите количество шагов рекурсии:" + input <- getLine + let n = read input :: Int + fractal <- barnsleyFern (0, 0) n + print fractal \ No newline at end of file