ndmitchell / hoogle

Haskell API search engine
http://hoogle.haskell.org/
Other
755 stars 137 forks source link

Find generic versions of the same function #399

Open newhoggy opened 1 year ago

newhoggy commented 1 year ago

I tried searching for this in Hoogle and found no matches:

Monad m => (e -> ExceptT x m a) -> ExceptT x m (Either e a) -> ExceptT x m a

I then implemented it like this:

onLeft :: Monad m => (e -> ExceptT x m a) -> ExceptT x m (Either e a) -> ExceptT x m a
onLeft h f = f >>= either h pure

Inferring the type signature I get this:

onLeft :: Monad m => (a -> m b) -> m (Either a b) -> m b
onLeft h f = f >>= either h pure

The inferred type signature is one that actually yields results:

Monad m => (a -> m b) -> m (Either a b) -> m b

fromRightM :: Monad m => (a -> m b) -> m (Either a b) -> m b
fromEitherMM :: Monad m => (e -> m a) -> m (Either e a) -> m a
fromEitherOrMM :: Monad m => m (Either e a) -> (e -> m a) -> m a

If Hoogle can somehow infer the generic type signature from the specialised one and put that in the search results, that would help a lot.

ndmitchell commented 1 year ago

Yep, this would be desirable - but its hard because of the way Hoogle is implemented. Hoogle essentially tries to find things that have the same shape, or the same interesting type names. Because you end up unifying ExceptT x m with m, you have neither the same shape or type names. If you just generatlise then you can generalise in many many ways, and that would be a bit of a combinatorial explosion. For instance, this type aliases with undefined and coerce. I don't have any great ideas for finding what you describe.