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
some
andmany
can be defined as:Perhaps it helps to see how
some
would be written with monadicdo
syntax:So
some f
runsf
once, then "many" times, and conses the results.many f
runsf
"some" times, or "alternatively" just returns the empty list. The idea is that they both runf
as often as possible until it "fails", collecting the results in a list. The difference is thatsome f
immediately fails iff
fails, whilemany f
will 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
.Nothing
means failure, sosome Nothing
fails as well and evaluates toNothing
whilemany Nothing
succeeds 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 retry
will retry itself, whilemany retry
will simply return the empty list.some f
andmany f
will runf
repeatedly until it retries. I'm not sure if this is useful thing, but I'm guessing it isn't.So, for
Maybe
,[]
andSTM
many
andsome
don'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.