Haskell: является ли (MonadPlus m => Bool -> a -> ma) бесполезным?

#haskell #monadplus

#хаскелл #monadplus

Вопрос:

Я был вдохновлен поиграть с FizzBuzz после того, как взглянул на codepad.org , и обнаружил, что мне нужна какая-то функция:

 mwhen :: MonadPlus m => Bool -> a -> m a
mwhen b = if b then return else const mzero
 

просто чтобы я мог сделать mwhen (n /? 3) "Foo" `mappend` mwhen (n /? 5) "Bar"

Я ожидал, что это будет на hoogle, но Bool -> a -> m a» rel=»nofollow»>без кубиков.

Это не так полезно, как я думаю?

Комментарии:

1. Это только я или, кажется, много вопросов на Хаскеле, в которых говорится: «Я не нашел его в Hoogle. Так это полезно? «. Я сделал это сам. Ответы, тем не менее, интересны.

Ответ №1:

mwhen b a точно guard b >> return a . Когда вы делаете больше вещей после guard , вы обычно связали бы a перед mwhen и не нуждаетесь в возврате. Таким образом, полезность mwhen, по-видимому, заключается в основном в сохранении нескольких нажатий клавиш в конце do-блоков.

Ответ №2:

Причина, по которой он не существует, заключается в том, что обычно в этом комбинаторе нет необходимости. Вы можете просто перезаписать результат a when с <$ помощью или >> , и, как обычно, у вас есть много других монадических операций после a when .