Similar to
liftA2, but more general. This allows you to
operate on two
Envelopes with different sets of errors. The
resulting
Envelope is a combination of the errors in each of
the input
Envelopes.
Examples
>>> let env1 = toSuccEnvelope "hello" :: Envelope '[Double, Int] String
>>> let env2 = toSuccEnvelope " world" :: Envelope '[Char] String
>>> liftA2Envelope (<>) env1 env2 :: Envelope '[Double, Int, Char] String
SuccEnvelope "hello world"
If either of the
Envelopes is an
ErrEnvelope, then
return the
ErrEnvelope.
>>> let env3 = toErrEnvelope "some err" :: Envelope '[String, Double] Int
>>> let env4 = toSuccEnvelope 1 :: Envelope '[Char] Int
>>> liftA2Envelope (+) env3 env4 :: Envelope '[String, Double, Char] Int
ErrEnvelope (Identity "some err")
>>> let env5 = toSuccEnvelope "hello" :: Envelope '[Char] String
>>> let env6 = toErrEnvelope 3.5 :: Envelope '[(), Double] String
>>> liftA2Envelope (<>) env5 env6 :: Envelope '[Char, (), Double] String
ErrEnvelope (Identity 3.5)
If both of the
Envelopes is an
ErrEnvelope, then
short-circuit and only return the first
ErrEnvelope.
>>> let env7 = toErrEnvelope 3.5 :: Envelope '[(), Double] String
>>> let env8 = toErrEnvelope 'x' :: Envelope '[Int, Char] String
>>> liftA2Envelope (<>) env7 env8 :: Envelope '[(), Double, Int, Char] String
ErrEnvelope (Identity 3.5)