#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 действительно, спасибо! Монада более специализирована, чем аппликативный функтор. По какой-то причине не удается отредактировать комментарий