IO monad 处理,简化绑定语法
IO monad handling, simplifying bind syntax
在 Haskell 中编写一个小型日期程序作为练习处理 monad 时,我想到了下面的 localDate
辅助函数。我更喜欢绑定链接语法而不是 do 块 - 请提供任何关于一种语法是否更符合 Haskell 标准的意见。
我的主要问题与简化 localDate
有关。是否可以在没有两次绑定操作的情况下将 getCurrentTimeZone 和 getCurrentTime 都传递给 utcToLocalTime?
localDate :: IO(Day)
localDate = localDay <$> zoneNow where
zoneNow = getCurrentTimeZone >>= \z -> getCurrentTime >>= \t -> return $ utcToLocalTime z t
localDate' :: IO(Day)
localDate' = do
z <- getCurrentTimeZone
t <- getCurrentTime
let zoneNow = utcToLocalTime z t
return $ localDay zoneNow
getCurrentTime >>= \t -> return $ utcToLocalTime z t
可以用仿函数映射代替:
getCurrentTimeZone >>= \z -> fmap (utcToLocalTime z) getCurrentTime
我们可以进一步改写为:
utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime
在localDate
中,你执行另一个函子映射,我们可以这样写:
localDate :: IO Day
localDate = localDay <$> <b>(</b>utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime<b>)</b>
或者我们可以将两个函子映射结合起来:
localDate :: IO Day
localDate = <b>(localDay.) . utcToLocalTime</b> <$> getCurrentTimeZone <*> getCurrentTime
这样就产生了当地时间:
Prelude Data.Time.Clock Data.Time.LocalTime> (localDay.) . utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime
2020-04-16
在 Haskell 中编写一个小型日期程序作为练习处理 monad 时,我想到了下面的 localDate
辅助函数。我更喜欢绑定链接语法而不是 do 块 - 请提供任何关于一种语法是否更符合 Haskell 标准的意见。
我的主要问题与简化 localDate
有关。是否可以在没有两次绑定操作的情况下将 getCurrentTimeZone 和 getCurrentTime 都传递给 utcToLocalTime?
localDate :: IO(Day)
localDate = localDay <$> zoneNow where
zoneNow = getCurrentTimeZone >>= \z -> getCurrentTime >>= \t -> return $ utcToLocalTime z t
localDate' :: IO(Day)
localDate' = do
z <- getCurrentTimeZone
t <- getCurrentTime
let zoneNow = utcToLocalTime z t
return $ localDay zoneNow
getCurrentTime >>= \t -> return $ utcToLocalTime z t
可以用仿函数映射代替:
getCurrentTimeZone >>= \z -> fmap (utcToLocalTime z) getCurrentTime
我们可以进一步改写为:
utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime
在localDate
中,你执行另一个函子映射,我们可以这样写:
localDate :: IO Day
localDate = localDay <$> <b>(</b>utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime<b>)</b>
或者我们可以将两个函子映射结合起来:
localDate :: IO Day
localDate = <b>(localDay.) . utcToLocalTime</b> <$> getCurrentTimeZone <*> getCurrentTime
这样就产生了当地时间:
Prelude Data.Time.Clock Data.Time.LocalTime> (localDay.) . utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime
2020-04-16