-
Notifications
You must be signed in to change notification settings - Fork 37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add function for (Maybe a, b) -> Maybe (a, b) #100
Comments
Thanks for the suggestion. How often do you think these patterns occur in practice? Would be good to get a sense of how useful they would be. |
Thanks for the reply! For me it's when I'm traversing a list and zip it up to return a map:
For example: newtype UserId = UserId Int deriving (Eq, Ord)
data User
getUserById :: UserId -> m (Maybe User)
getUserById = undefined
getUsersById :: Monad m => [UserId] -> m (Map UserId User)
getUsersById userIds =
fromList . mapMaybe maybeSnd . zip userIds <$> traverse getUserById userIds |
Would be interesting to get a sense of how often this occurs. One way would be to add an hlint rule and run it over a reasonable volume of Haskell code to show how often this shows up (or maybe just grep for it). Another would be to ask on Twitter/Reddit or similar if people have this issue. |
strong :: Functor f => (a, f b) -> f (a, b)
strong (a, fb) = fmap (a,) fb is common enough pattern it has a name (strong functors), and all haskell strong :: Functor f => a -> f b -> f (a, b)
strong a fb = fmap (a,) fb and then getUsersById :: Monad m => [UserId] -> m (Map UserId User)
getUsersById userIds =
fromList . mapMaybe maybeSnd . zip userIds <$> traverse getUserById userIds I'd write that as getUsersById :: Monad m => [UserId] -> m (Map UserId User)
getUsersById usedIds = fromList . catMaybes <$> forM userIds $ \usedId ->
user <- getUsersById
return (strong userId user) but here it's easy to inline The \xs -> catMaybes <$> traverse f xs is generalized to |
@phadej Quite late to seeing this. Thanks a lot for the detailed insight! |
It'd be cool if you'd accept these functions:
Not sure what to name these, but if this feature request is welcome, I'd be happy to create a pull request!
The text was updated successfully, but these errors were encountered: