【问题标题】:IO monad handling, simplifying bind syntaxIO monad 处理,简化绑定语法
【发布时间】:2020-07-30 00:26:39
【问题描述】:

在编写一个小型日期程序作为练习在 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

【问题讨论】:

  • 你可以把这个改写成utcToLocalTime &lt;$&gt; getCurrentTimeZone &lt;*&gt; getCurrentTime,把localDate改写成localDate = (. localDay) . utcToLocalTime &lt;$&gt; getCurrentTimeZone &lt;*&gt; getCurrentTime
  • liftA2

标签: haskell functional-programming monads


【解决方案1】:

getCurrentTime &gt;&gt;= \t -&gt; return $ utcToLocalTime z t 可以替换为仿函数映射:

getCurrentTimeZone >>= \z -> fmap (utcToLocalTime z) getCurrentTime

我们可以进一步改写为:

utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime

localDate中,你执行另一个函子映射,我们可以这样写:

localDate :: IO Day
localDate = localDay <$> (utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime)

或者我们可以将这两个函子映射与:

localDate :: IO Day
localDate = (localDay.) . utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime

这就产生了当地的日子:

Prelude Data.Time.Clock Data.Time.LocalTime> (localDay.) . utcToLocalTime <$> getCurrentTimeZone <*> getCurrentTime
2020-04-16

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 2018-05-05
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多