gpt4 book ai didi

haskell - `forM_` 是惯用的 Haskell 吗?

转载 作者:行者123 更新时间:2023-12-04 06:29:48 25 4
gpt4 key购买 nike

我倾向于使用forM_在 Haskell 中,这很像 .each在 Ruby 或 foreach在斯卡拉。

import Control.Monad (forM_)
import Network.BSD (getHostByName, hostAddresses)
import Network.Socket (inet_ntoa)
import System.Environment (getArgs)

resolve address = do
ent <- getHostByName address
mapM inet_ntoa (hostAddresses ent)

main = do
args <- getArgs
args `forM_` (\address -> do
ips <- resolve address
ips `forM_` (\ip -> putStrLn $ address ++ "\t" ++ ip))

对我来说这似乎不是惯用的,但使用 mapM_看起来很笨拙。有没有一种惯用的方式来重写这段代码?

最佳答案

是的,尽管您最好只使用 for_ :: (Foldable t, Applicative f) => t a -> (a -> f b) -> f ()来自 Data.Foldable .

同样通过使用它作为前缀(即普通函数),代码看起来像一个“普通”命令式代码:

main = do
args <- getArgs
for_ args $ \address -> do
ips <- resolve address
for_ ips $ \ip -> putStrLn $ address ++ "\t" ++ ip

附言 Applicative Monad 的版本ic“遍历”:
  • mapM ~ traverse
  • mapM_ ~ traverse_
  • forM ~ for
  • forM_ ~ for_
  • 关于haskell - `forM_` 是惯用的 Haskell 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39100320/

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