What are the functions some and many in the Alternative type class useful for? Docs provide a recursive definition which I was unable to comprehend.
'some' and 'many' functions from the 'Alternative' type class
2.9k views Asked by missingfaktor At
2
someandmanycan be defined as:Perhaps it helps to see how
somewould be written with monadicdosyntax:So
some frunsfonce, then "many" times, and conses the results.many frunsf"some" times, or "alternatively" just returns the empty list. The idea is that they both runfas often as possible until it "fails", collecting the results in a list. The difference is thatsome fimmediately fails ifffails, whilemany fwill still succeed and "return" the empty list in such a case. But what all this exactly means depends on how<|>is defined.Is it only useful for parsing? Let's see what it does for the instances in base:
Maybe,[]andSTM.First
Maybe.Nothingmeans failure, sosome Nothingfails as well and evaluates toNothingwhilemany Nothingsucceeds and evaluates toJust []. Bothsome (Just ())andmany (Just ())never return, becauseJust ()never fails! In a sense they evaluate toJust (repeat ()).For lists,
[]means failure, sosome []evaluates to[](no answers) whilemany []evaluates to[[]](there's one answer and it is the empty list). Againsome [()]andmany [()]don't return. Expanding the instances,some [()]meansfmap (():) (many [()])andmany [()]meanssome [()] ++ [[]], so you could say thatmany [()]is the same astails (repeat ()).For
STM, failure means that the transaction has to be retried. Sosome retrywill retry itself, whilemany retrywill simply return the empty list.some fandmany fwill runfrepeatedly until it retries. I'm not sure if this is useful thing, but I'm guessing it isn't.So, for
Maybe,[]andSTMmanyandsomedon't seem to be that useful. It is only useful if the applicative has some kind of state that makes failure increasingly likely when running the same thing over and over. For parsers this is the input which is shrinking with every successful match.