Rfcs: Option::zip

Created on 24 Jan 2016  路  9Comments  路  Source: rust-lang/rfcs

I sure would like to have the method Option::zip

fn zip<U>(self, Option<U>) -> Option<(T, U)>

Currently I have to do a.into_iter().zip(b).next() which is just a tiny bit verbose.

T-libs

Most helpful comment

This is now implemented, although unstable.

Closing in favor of tracking issue: https://github.com/rust-lang/rust/issues/70086

All 9 comments

a.and_then(|x| b.map(|y| (x, y))) also works, although isn't much less verbose.

The desired behavior here is to return Some iff self and other are Some?
The signature looks like it should take self by value rather than by ref.

I think this is a pretty good idea since it's so simple, but I am not sure what the use-case is.

alternatively there could be an impl<T, U> Into<Option<(T, U)>> for (Option<T>, Option<U>). But that might be a bit too much logic for the into operation.

Option::zip(a, b)

vs

(a, b).into()

I think that second approach is better, but it type of (a, b).into() is not inferrable right now.

:-1: for me. It seems like a niche use case. Also, having an operation named zip on Iterator that acts slightly different seems unfortunate.

FWIW using #243 extended with Option compatibility, it would also be possible to express this as try { (a?, b?) }.

This is now implemented, although unstable.

Closing in favor of tracking issue: https://github.com/rust-lang/rust/issues/70086

Interesting idea. That鈥檚 basically a specialization of applicative functors. Indeed, you use a tuple constructor, but you could do much more with an applicative functor. It鈥檚 a pity we don鈥檛 have applicative functor notation in Rust. :)

As a base of comparison, you do it this way in Haskell:

-- all these are identical
x = liftA2 (,) firstMaybe secondMaybe

x = (,) <$> firstMaybe <*> secondMaybe

x = do
  a <- firstMaybe
  b <- secondMaybe
  pure (a, b)

@phaazon note that we have special-cased do (I think?...) for some types, e.g.:

let x = try { (first?, second?) };

The try{} block itself is unstable (https://github.com/rust-lang/rust/issues/31436) but the question mark operator in functions is stable.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

3442853561 picture 3442853561  路  4Comments

3442853561 picture 3442853561  路  3Comments

Diggsey picture Diggsey  路  3Comments

rudolfschmidt picture rudolfschmidt  路  3Comments

steveklabnik picture steveklabnik  路  4Comments