Применить функцию `a -> Maybe b` к `Maybe a’

#haskell

#haskell

Вопрос:

Допустим, у меня есть функция parse :: String -> Maybe (Integer, String) , которая анализирует первое целое i число из списка целых чисел, закодированных в виде строки s , 1,2,3 и возвращает Just (i, s') , где s' находится оставшаяся строка, или Nothing если синтаксический анализ не удался.

Как я могу затем кратко применить эту функцию к a Maybe String ? parse <$> maybeString имеет избыточный тип Maybe (Maybe (Integer, String)) , и написание пользовательской функции сопоставления с образцом для этого кажется излишним.

В более общем плане: существует ли эквивалент <$> типа (a -> f b) -> f a -> f b (или это не имеет смысла?).

РЕДАКТИРОВАТЬ: я глуп, я только что понял, что для этого есть Hoogle. Это то, для чего нам нужны монады? (Я еще не дошел до этой части Haskell).

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

1. Да, это то, для чего Monad нужны s. Вы хотите parse , чтобы функция выполнялась условно в зависимости от аргумента (запустите ее, если аргумент есть Just x , пропустите, если аргумент есть Nothing ). Возможность пропускать или не пропускать вызов (аппликативных / монадических) функций в зависимости от данных — это то, что делает Monad более мощным, чем Applicative .

Ответ №1:

Похоже, вы ищете (>>=) , что вы можете использовать, например maybeString >>= parse . Для этого требуется, чтобы тип данных, с которым вы работаете, был монадой, которая Maybe удовлетворяет.

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

1. Это имеет смысл, поэтому монады являются «суперклассом» аппликативных функторов, верно?

2. @Питер почти! Монада является более общим, чем аппликативный функтор (все, что вы можете сделать в монаде, вы можете сделать в аппликативном функторе). В более новых версиях GHC вам необходимо предоставить прикладной экземпляр для ваших Monads ( class Applicative m => Monad m where )

3. @ymegdiche Я предполагаю, что это была опечатка, но ваше утверждение потенциально вводит в заблуждение — монада на самом деле менее общая, чем аппликативная. Каждая монада обязательно является аппликативом, но не наоборот.

4. @RobinZigmond действительно, спасибо! Монада более специализирована, чем аппликативный функтор. По какой-то причине не удается отредактировать комментарий