是'forM_`惯用的Haskell?

Ste*_*haw 6 haskell

我倾向于forM_在Haskell中使用它,就像.each在Ruby或foreachScala中一样.

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))
Run Code Online (Sandbox Code Playgroud)

它对我来说mapM_似乎不是惯用的,但使用似乎很笨拙.有没有惯用的方法来重写这段代码?

pha*_*dej 11

这是,虽然你可能会更好地利用刚刚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
Run Code Online (Sandbox Code Playgroud)

PS Applicative版本的Monadic"遍历":

  • mapMtraverse
  • mapM_traverse_
  • forMfor
  • forM_for_