gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:37:02 24 4
gpt4 key购买 nike

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

我的主要问题与简化 localDate 有关.是否可以在没有两个绑定(bind)操作的情况下将 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 <$> (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

关于haskell - IO monad 处理,简化绑定(bind)语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com