我倾向于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"遍历":
mapM 〜 traversemapM_ 〜 traverse_forM 〜 forforM_ 〜 for_