2016-06-11 71 views
0

如何将当前日期作为Day类型存储在记录中?这是做这件事的正确方法吗?我想这样做是为了能够在应用程序中操作日期,还可以使用Opaleye或Esqueleto将它们存储在数据库中。如何仅将当前日期作为日类型存储在记录中?

我有这样的:

import Data.Time 
import Data.Time.Format 

data User = User 
    { userId :: Int 
    , name  :: Text 
    , loginDate :: Day 
    } deriving (Eq, Show) 


currentDay :: Day 
currentDay = utctDay <$> getCurrentTime ??? 

users :: [User] 
users = [ User 1 "A" currentDay 
     , User 2 "B" currentDay 
     ] 

currentDay类型是IO Day。我怎样才能得到它只有Day?我猜这是不可能的,而不会破坏类型安全,但我不确定。

我的loginDate的类型更改为IO Day但后来我就不能推导EqShow,因此无法同时使用的仆人使用deriveJSON。如果我将currentDay的类型更改为IO DayusersIO [User],那么我不能使用Servant类型。

回答

1

currentDay(以及getCurrentTime)是一个IO动作。您必须在IO-monad中执行它以检索当前日期。

你的代码应该是这样的:

currentDay :: IO Day 
currentDay = utctDay <$> getCurrentTime 

createUsers :: IO [User] 
createUsers = do 
    today <- currentDay 
    return [ User 1 "A" today, User 2 "B" today ] 
+0

但我不能跟佣人使用IO单子,可以吗? – OneEyeQuestion

+1

当然可以。你想把你的代码放在哪里?通常使用'liftIO'是你所需要的。 – ErikR

+0

你可以结合其中一个在IO monad('IO [User]')而另一个不是('[Friend]')的两个端点吗? – OneEyeQuestion

相关问题