如何在Haskell中将Date转换为Int

时间:2011-04-20 19:22:50

标签: date haskell

将下面这些函数的输出转换为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

在理想的世界中,我想要几个函数来展平这些IO函数,以便将Int - (2011,4,20)转换为201142055671(当前类型为IO Integer)到{{ 1}}作为Int

请告诉我是否有更好的方法来完成此操作!

编辑:对不起,如果不清楚,我的意思是如何将日期55671的输出转换为{{1 }}

2 个答案:

答案 0 :(得分:3)

您知道如何从monadic上下文中返回值吗?

如果您有类型的功能:

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

您可以在IO monad中的任何其他函数中使用它。像这样:

 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 :(得分:1)

如果我正确理解了你的部分问题,你基本上想要一个函数,比如说ff (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

编辑:请永远不要忘记,基本上,没有(非作弊)函数IO a -> a。所以除非你打破纯洁原则,否则你想要的是不可能的。请考虑使用函数fmap f :: IO (Integer, Int, Int) -> IO Integer