2011-04-20 23 views
2
我有一個有點問題

與下面這些函數的輸出轉換爲int如何將日期轉換爲int在Haskell

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

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

基本上我想利用無論從輸出(只要可能,就不會發生),並將其變成一個整數。例如今天是20/4/11所以date會給(2011,4,20)date'會給55671

在一個理想的世界,我想了幾個功能,以拉平這些IO功能,給一個Int - (2011,4,20)201142055671(目前的類型IO整數),以55671爲int

如果有,請告訴我是完成這個更好的方法!

編輯:很抱歉,如果它不是清楚的,我的意思是你怎麼日期(2011,4,20) :: IO (Integer,Int,Int)的輸出轉換爲20110420 :: Int

+0

如果你試圖從一個不純的函數中獲得一個純粹的值(也就是說你想用'date''來定義'date''來返回一個普通的'Integer'),那麼你最好放棄任何'重新做,並閱讀關於該主題的教程......即使是更糟糕的人通常都能夠清楚地陳述「分離IO和純代碼」的事情。 – delnan 2011-04-20 19:26:12

+0

你的問題是如何將'(2011,4,20)'轉換爲'20110420',或者如何將一個'IO Integer'轉換爲普通的'Integer'? – sth 2011-04-20 19:27:34

回答

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 

編輯:請永遠不要忘記,基本上,沒有(noncheating)功能IO a -> a。所以你想要的是不可能的,除非你破壞純度原則。請考慮只使用功能fmap f :: IO (Integer, Int, Int) -> IO Integer

+0

以下我非常困惑!我知道沒有任何功能可以使'IO a - > a'這些不被認爲不好的做法。但我仍在努力消除IO元素。在一個完美的世界裏,我會有一些需要'UTCTime - >(Integer,Int,Int)'的日期,並且JUST返回一個'Int'作爲desribed。根本沒有涉及「IO」。純粹的「Int」。這是我正在做的事情的關鍵。 – 2011-04-20 20:10:57

+0

@Ed George。你能清楚地說出你想要的功能簽名嗎?它是'UTCTime - >整數'嗎?如果我知道你在找什麼,我可以幫助你更輕鬆。此外,一如既往地問自己,這樣的簽名是否合理*。這意味着用文字描述。 – Tarrasch 2011-04-20 20:19:55

+0

對不起,我只是想要一個函數將日期變成純粹的Int。像任何其他Int可以添加到,減去等! – 2011-04-20 20:34:25

3

你知道如何從一個單子背景下返回值?

如果您有類型的功能:

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

可以在IO單子用它從任何其他功能。像這樣:

main = do 
    n <- date 
    print n 

其中n將有類型Integer。爲了(不安全)轉換IntegerInt,使用fromIntegral

IO Integer函數實際上轉換爲IO Int功能,地圖fromIntegral,就像這樣:

date :: IO Integer 
date = getCurrentTime >>= return . fromIntegral . toModifiedJulianDay . utctDay 
+0

不幸的是,我需要一個函數來返回一個Int,而不是使用main方法來打印一個Integer。 我想出了這個僞劣代碼,認爲它會工作: 'method = do fromIntegral x' \t'where x = date'' 也許我在這裏得到了錯誤的結尾? – 2011-04-20 19:53:15

+0

@Ed George:你不能寫一個(安全)函數來做'IO a - > a',但是你可以在do < rampion 2011-04-21 19:39:31

+0

最終我使用'date'函數,你在和unsafePerformIO一起定義後,意識到它不是世界末日,如果我使用它一次! – 2011-04-25 16:24:28