Как преобразовать дату в Int в Haskell - PullRequest
2 голосов
/ 20 апреля 2011

У меня возникла небольшая проблема с преобразованием вывода этих функций ниже в Int

date :: IO (Integer,Int,Int)
date = getCurrentTime >>= return . toGregorian . utctDay

date' :: IO Integer
date' = getCurrentTime >>= return . toModifiedJulianDay . utctDay

По сути, я хочу взять вывод из любого (не слитного, который так долго, как это возможно) и превратить его в int. например Сегодня 20/4/11, поэтому date даст (2011,4,20), а date' даст 55671.

В идеальном мире я хочу, чтобы пара функций сгладила эти функции ввода-вывода, чтобы присвоить Int - (2011,4,20) - 2011420 и 55671 (в настоящее время типа IO Integer) - 55671 как Int * 1014. *

Пожалуйста, сообщите мне, если есть лучшие способы завершить это!

edit: Извините, если не ясно, я имел в виду, как вы можете преобразовать вывод даты (2011,4,20) :: IO (Integer,Int,Int) в 20110420 :: Int

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Знаете ли вы, как вернуть значения из монадического контекста?

Если у вас есть функция типа:

 date :: IO Integer
 date = getCurrentTime >>= return . toModifiedJulianDay . utctDay

Вы можете использовать его из любой другой функции в монаде IO. Вот так:

 main = do
     n <- date
     print n

, где n будет иметь тип Integer. Для (небезопасного) преобразования Integer в Int используйте fromIntegral

Чтобы фактически преобразовать функцию IO Integer в функцию IO Int, отобразите fromIntegral, например, так:

 date :: IO Integer
 date = getCurrentTime >>= return . fromIntegral . toModifiedJulianDay . utctDay
1 голос
/ 20 апреля 2011

Если я правильно понял часть вашего вопроса, вам, в основном, нужна функция, скажем f, такая, что f (123,456,789) = 123456789, где все эти числа являются числами. Так что f :: (Integer, Int, Int) -> Integer.

module Temp where

import Data.Time
import Data.Time.Calendar.WeekDate

date :: UTCTime -> (Integer, Int, Int)
date = toWeekDate . utctDay

f :: (Integer, Int, Int) -> Integer
f (a,b,c) = read $ show a ++ show b ++ show c 

main = do
  utcTime <- getCurrentTime
  putStr "original format: " >>  print (date utcTime)
  putStr "flattened format: " >> print (f . date $ utcTime)

В ghci:

*Temp> main
original format: (2011,16,3)
flattened format: 2011163

edit: Пожалуйста, никогда не забывайте, что, по сути, нет функции (без чита) IO a -> a. То, что вы хотите, невозможно, если вы не нарушите принципы чистоты. Пожалуйста, рассмотрите возможность использования функции fmap f :: IO (Integer, Int, Int) -> IO Integer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...