haskell - IO monad 处理,简化绑定(bind)语法

标签 haskell functional-programming monads

在编写一个小型日期程序作为练习在 Haskell 中处理 monad 时,我想出了下面的 localDate 辅助函数。与 do block 相比,我更喜欢绑定(bind)链接语法 - 请提供有关一种语法是否更符合 Haskell 标准的任何意见。

我的主要问题与简化localDate有关。是否可以将 getCurrentTimeZone 和 getCurrentTime 都传递给 utcToLocalTime 而无需两次绑定(bind)操作?

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 - IO monad 处理,简化绑定(bind)语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255763/

相关文章:

haskell - 使 haskell 程序在(大致)恒定量的内存中运行

c# - 通过检查元素的条件将列表拆分为子列表

scala - 在理解中结合列表、 future 和选项 - scalaz

列表 Monad : Consequences of the signature of List. flatMap(f: (A) ⇒ GenTraversableOnce[B])

java - 抽象数据与抽象行为

haskell - 说明 Category、Monoid 和 Monad 的简单例子?

haskell - 如何使用 putStrLn 进行跟踪(Haskell)

haskell - 过滤统一列表的列表

multithreading - 我可以限制 Haskell 中每个函数/monad/线程的内存使用吗?

javascript - 如何使用 reduce 和 range 编写阶乘函数?