Функция, аналогичная (>> =), но возвращающая другую монаду

Тип (>> =) -

(>>=) :: Monad m => m a -> (a -> m b) -> m b

Мне нужна функция с типом:

(Monad m, Monad n) => m a -> (a -> n b) -> n b

Эту функцию можно использовать для объединения различных монад в цепочку.

Я столкнулся с этой проблемой, когда пытался получить 3000 из аргументов командной строки -p 3000 :

main = getArgs >>= (\args -> (elemIndex "-p" args) >>= (\id -> warpDebug (fromIntegral.read (args !! (id+1))) Ilm))

Это явно не компилируется, потому что getArgs возвращает IO [String] , а elemIndex возвращает Maybe Int . Для элегантного решения этой проблемы можно использовать функцию вышеупомянутого типа. Мой вопрос:

  • Эта функция уже определена? ( Google не нашел)
  • Если нет, то, вероятно, по какой-то причине. В чем тогда причина? Считается ли это плохой практикой? Я думаю, что это лучший способ, чем использовать выражение case.

9
задан Abdulsattar Mohammed 23 December 2011 в 09:05
поделиться