将下面这些函数的输出转换为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)
转换为2011420
和55671
(当前类型为IO Integer)到{{ 1}}作为Int
请告诉我是否有更好的方法来完成此操作!
编辑:对不起,如果不清楚,我的意思是如何将日期55671
的输出转换为{{1 }}
答案 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)
如果我正确理解了你的部分问题,你基本上想要一个函数,比如说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
编辑:请永远不要忘记,基本上,没有(非作弊)函数IO a -> a
。所以除非你打破纯洁原则,否则你想要的是不可能的。请考虑使用函数fmap f :: IO (Integer, Int, Int) -> IO Integer
。