Haskell — Чем полезен Control.Applicative.Alternative?

Я искал класс Applicative в библиотеках Haskell и наткнулся на Alternative.

Чем хорош этот класс? Поиск в гугле ничего особенно интересного не дал. И это, кажется, совершенно неуместно в комплекте с пакетом Applicative.

Может ли кто-нибудь опубликовать возможный сценарий, в котором вы будете использовать этот класс?


person Anupam Jain    schedule 26.08.2011    source источник


Ответы (2)


Он обычно используется с комбинаторами парсеров. Например, если space — это комбинатор синтаксического анализатора, который соответствует одному символу пробела, many space будет комбинатором, который будет соответствовать последовательному пробелу.

Я могу согласиться, что это немного неуместно в Control.Applicative.

person hammar    schedule 26.08.2011
comment
Только немного неуместно — это моноид на Applicatives по тому же шаблону, что и MonadPlus и ArrowPlus, оба из которых также имеют общий модуль с классом, на котором они основаны. Для согласованности его следовало бы назвать ApplicativePlus, но это уродливое имя. - person C. A. McCann; 26.08.2011
comment
Ладно, это многое объясняет! Хотя называть ApplicativePlus в Alternative не так уж и хорошо, поскольку у последнего есть коннотации, которые ограничивают его область применения. - person Anupam Jain; 26.08.2011
comment
@С. А. Макканн, я бы хотел, чтобы вы превратили свой комментарий в ответ, чтобы я мог его принять :) - person Anupam Jain; 30.08.2011
comment
@Anupam Jain: Эх, я думаю, что все в порядке. Хаммар уже рассказал о том, где он на самом деле используется, и мне не хочется повторять это, чтобы дать полный ответ... - person C. A. McCann; 31.08.2011

Иногда оператор <|> весьма полезен:

foldl1 (<|>) [Nothing, Just 5, Just 3]
-- Just 5
person Landei    schedule 26.08.2011
comment
Ах, это интересно! В этом контексте ‹|› похоже на короткое замыкание || оператор во многих императивных языках.. - person Anupam Jain; 26.08.2011
comment
Вы также можете сделать это, используя mconcat с моноид First. Это хорошо обобщается на другие Maybe моноидов. - person hammar; 26.08.2011
comment
О, нет, foldl1 использовалось где-то там, где есть разумное значение по умолчанию (foldl (<|>) Nothing). Что вы будете делать, когда ваш ответ выйдет из строя? :D - person Rotsor; 26.08.2011
comment
@Rotsor или foldl (<|>) empty вообще, учитывая, что empty - это личность (<|>) - person sam boosalis; 31.01.2015
comment
В общем, Data.Foldable.asum тоже предоставляет этот функционал - person abhillman; 19.05.2015