Скажем, у меня есть функция parse :: String -> Maybe (Integer, String)
, которая анализирует первое целое число i
из списка целых чисел, закодированных как строка s
, например 1,2,3
, и возвращает Just (i, s')
, где s'
— оставшаяся строка, или Nothing
, если синтаксический анализ не удался.
Как я могу кратко применить эту функцию к Maybe String
? parse <$> maybeString
имеет избыточный тип Maybe (Maybe (Integer, String))
, и написание собственной функции сопоставления с образцом для этого кажется излишним.
В более общем плане: существует ли эквивалент <$>
типа (a -> f b) -> f a -> f b
(или это не имеет смысла?).
Обновлено: я глуп, я только что понял, что для этого есть Hoogle. Для этого ли нам нужны монады? (Я еще не добрался до этой части Haskell).
Похоже, вы ищете (>>=)
, который можно использовать как maybeString >>= parse
. Для этого требуется, чтобы тип данных, с которым вы работаете, был монадой, которая Maybe
удовлетворяет.
В этом есть смысл, так что монады — это «суперкласс» аппликативных функторов, верно?
@Питер почти! Монада является более общей, чем аппликативный функтор (все, что вы можете сделать в монаде, вы можете сделать в аппликативном функторе). В более новых версиях GHC вам необходимо предоставить аппликативную инстанцию для ваших монад (class Applicative m => Monad m where
)
@ymegdiche Я предполагаю, что это была опечатка, но ваше утверждение потенциально может ввести в заблуждение - монада на самом деле менее универсальна, чем аппликатив. Каждая монада обязательно является аппликативной, но не наоборот.
@RobinZigmond действительно, спасибо! Монада более специализирована, чем аппликативный функтор. Почему-то не могу отредактировать комментарий
Да, для этого и нужны
Monad
s. Вы хотите, чтобы функцияparse
запускалась условно в зависимости от аргумента (запустите ее, если аргументJust x
, пропустите, если аргументNothing
). Возможность пропустить или не пропустить вызов (аппликативных/монадических) функций в зависимости от данных — это то, что делаетMonad
более мощным, чемApplicative
.