Ответ 1
Действительно. forM
буквально просто...
forM = flip mapM
... так что это за исключением порядка аргументов. Как стиль, forM
выглядит красиво, когда аргумент функции представляет собой большой блок кода, который вы не удосужились дать имя, как в:
-- Somewhere in a do-block...
results <- forM items $ \item -> do
-- A do-block using `item`.
Примечание: особенно если вы используете последнюю версию GHC (и, следовательно, версию пакета base
версии 4.8), я предлагаю заменить mapM
и forM
на эквивалентные, но более общие traverse
и for
функций соответственно. Прелюдия в base-4.8
экспортирует traverse
, в то время как вы можете найти for
в Data.Traversable
. Аналогично, Data.Foldable
предлагает traverse_
и for_
, которые являются более строгими, чем mapM_
и forM_
.