wah :: Int -> IO ()
wah count = do rnds <- sequence $ replicate count $ randomRIO (0, 59)
time <- getZonedTime
let times = map (loctime $ zonedTimeToLocalTime time) rnds
costs <- sequence $ replicate count $ randomRIO (100, 200 :: Int)
volumes <- sequence $ replicate count $ randomRIO (10, 20)
let candles = map (\(t, c, v) -> (Tick t c v)) $ zip3 times costs volumes
let cnd = mconcat candles
putStrLn $ fromMaybe "Undefined" $ getCandleColor cnd >>= return . show
putStrLn $ "open is " ++ (show $ candleOpenCost cnd)
where
(zonedTimeToLocalTime time) rnd}
loctime :: LocalTime -> Int -> LocalTime
loctime time rnd = time {localTimeOfDay = tofday (localTimeOfDay time) rnd}
tofday :: TimeOfDay -> Int -> TimeOfDay
tofday time rnd = time {todSec = topico rnd}
topico :: Int -> Pico
topico val = (toEnum val * (fromInteger $ resolution $ ((toEnum val) :: Pico)))
Собственно что мы тут видим ? функция которая в начале генерирует список случайных чисел и этот список использует для создания списка элементов LocalTime где оригинальная секунда заменена на число из списка. То что делает функция дальше нас не волнует.
Есть такая фишка в хаскеле можно писать
..... = var {something = newvalue}
PS:: особо доставляет функция topico которая «правильно» преобразует Int в Pico умножая его на размерность Pico (простой toEnum возвращает милиардные доли секунды, правильный хаскель такое правильный).