Есть ли функция в haskell для периода времени в секундах/миллисекундах?
возможно что-то похожее на java
System.currentTimeMillis();
изменить: как Int
или Integer
?
Есть ли функция в haskell для периода времени в секундах/миллисекундах?
возможно что-то похожее на java
System.currentTimeMillis();
изменить: как Int
или Integer
?
Да.
Время эпохи UNIX можно найти как Int
следующим образом:
> :m + Data.Time System.Locale Control.Applicative
> epoch_int <- (read <$> formatTime defaultTimeLocale "%s" <$> getCurrentTime) :: IO Int
> epoch_int
1375025861
UPD: как заметили другие пользователи, существует гораздо более простой способ сделать это:
> :m + Data.Time.Clock.POSIX
> round `fmap` getPOSIXTime
1375040716
it :: Integer
Попробуйте следующее:
import Data.Time
import Data.Time.Clock.POSIX
t = getPOSIXTime
Он имеет 6 десятичных знаков точности.
Как насчет:
import Data.Time.Clock.POSIX (getPOSIXTime)
timeNanos, timeMicros, timeMillis :: IO Integer
t mul = round . (mul *) <$> getPOSIXTime
timeNanos = t 1000000000
timeMicros = t 1000000
timeMillis = t 1000
main = do
tNanos <- timeNanos
tMicros <- timeMicros
tMillis <- timeMillis
print tNanos
print tMicros
print tMillis
-- OUT:
-- 1539161680010615122
-- 1539161680010617
-- 1539161680011
Существует также решение, обсуждаемое в Real World Haskell:
import System.Time
getClockTime >>= (\(TOD sec _) -> return sec)
Может быть:
getCurrentTime >>= pure . (1000*) . utcTimeToPOSIXSeconds >>= pure . round
Round
- получить целое число, которое на самом деле не является обязательным...
исходный ответ был без (1000*)
- теперь исправлено
Это работает:
import System.IO.Unsafe
import Data.Time.Clock.POSIX
time = round (unsafePerformIO getPOSIXTime) :: Int
unsafePerformIO извлекает время из монады IO. Округление до Int дает желаемый результат.
UPDATE: В моих веб-приложениях Haskell я иногда использую unsafePerformIO для заполнения HTML-флажка и форм-кнопок с произвольными номерами и скрытыми отметками времени. Иногда текстовые поля и текстовые поля позволяют пользователям (игрокам интерактивных игр) предоставлять такие данные, как произвольные числа и даты. Джастин, я надеюсь, вы не считаете, что предоставленные пользователем значения более безопасны, чем случайные числа и штампы времени, которые я подаю в формы? И я надеюсь, что вы не думаете, что я имел в виду: "Используйте такие вещи, как unsafePerformIO, если вы не понимаете, что делаете".
Веб-браузеры используют HTML, CSS и Javascript. Вы не можете "сохранить его в монаде IO", и браузеры не работают более или менее безопасно, в зависимости от того, как получаемые ими значения выходят из монадов Haskell.
Джастин, в интересах всех, кто читает эту страницу, я прошу вас пересмотреть и сказать, если вы все еще думаете, что я "действительно не должен использовать небезопасныйPerformIO таким образом"? Мой ум открыт. Я просто не знаю, что, во всяком случае, я могу ошибаться в своей работе или почему читателям не следует уклоняться от изучения от меня двумя голосами.
P.S. Я слышал, что нельзя говорить # @!% Перед детьми или в смешанной компании. Я опубликовал слово "U", где новички могли его увидеть? Боже упаси! -DS