unisonweb / unison

A friendly programming language from the future
https://unison-lang.org
Other
5.68k stars 265 forks source link

I can't find this M2.Exception that my type signature is talking about #3484

Open stew opened 1 year ago

stew commented 1 year ago
.share.stew.public.projects.httpserver.main> ls example  

  1. handler (http.HttpRequest ->{IO, M2.Exception, Abort} http.HttpResponse)

but when I try to find M2.Exception, I don't have a good way of finding it. There IS an Exception in my local namespace:

.share.stew.public.projects.httpserver.main> names lib.base.abilities.Exception

  Type
  Hash:  #4n0fgs00hp
  Names: lib.base.abilities.Exception
         lib.http.lib.base.abilities.Exception
         lib.http.lib.codec.lib.base.abilities.Exception
         lib.http.lib.parser.lib.base.abilities.Exception
         lib.semaphore.lib.base.abilities.Exception

When I run find Exception, it doesn't find anything in an M2 namespace:

.share.stew.public.projects.httpserver.main> find Exception

  ☝️

  I couldn't find matches in this namespace, searching in 'lib'...

  1.  structural ability lib.base.abilities.Exception
  2.  unique type lib.base.math.ArithmeticException
  3.  lib.base.abilities.Abort.toException : '{Abort} a -> Type -> Text ->{Exception} a
  4.  lib.base.abilities.Abort.toGenericException : Text
                                                    -> e
                                                    ->{Exception} '{Abort} a
                                                    ->{Exception} a
  5.  lib.base.abilities.Exception.onException : (Failure ->{e} ())
                                                 -> '{g, Exception} a
                                                 ->{e, g, Exception} a
  6.  lib.base.abilities.Throw.toException : (e ->{g1} Failure)
                                             -> '{g2, Throw e} a
                                             ->{g1, g2, Exception} a
  7.  lib.base.Either.toException : Either Failure a ->{Exception} a
  8.  unique type lib.base.abilities.Exception.Generic
  9.  lib.base.abilities.Exception.bracket : '{g, Exception} r
                                             -> (r ->{g, Exception} ())
                                             -> (r ->{g, Exception} a)
                                             ->{g, Exception} a
  10. lib.base.abilities.Exception.bracket.doc : Doc
  11. lib.base.abilities.Exception.catch : '{g, Exception} a ->{g} Either Failure a
  12. lib.base.abilities.Exception.catch.doc : Doc
  13. lib.base.abilities.Exception.catchMany : [Type]
                                               -> '{g, Exception} a
                                               ->{g, Exception} Either Failure a
  14. lib.base.abilities.Exception.catchMany.doc : Doc
  15. lib.base.abilities.Exception.catchOnly : Type
                                               -> '{g, Exception} a
                                               ->{g, Exception} Either Failure a
  16. lib.base.abilities.Exception.catchOnly.doc : Doc
  17. lib.base.abilities.Exception.doc : Doc
  18. lib.base.abilities.Exception.doc.div : Nat -> Nat ->{Exception} Nat
  19. lib.base.abilities.Exception.failOnError : Text -> Either e a ->{Exception} a
  20. lib.base.abilities.Exception.finally : '{g, Exception} ()
                                             -> '{g, Exception} a
                                             ->{g, Exception} a
  21. lib.base.abilities.Exception.finally.doc : Doc
  22. lib.base.abilities.Exception.Generic.failure : Text -> a -> Failure
  23. lib.base.abilities.Exception.hush : '{g, Exception} t ->{g} Optional t
  24. lib.base.abilities.Exception.hush.doc : Doc
  25. lib.base.abilities.Exception.onException.doc : Doc
  26. lib.base.abilities.Exception.raise : Failure ->{Exception} x
  27. lib.base.abilities.Exception.reraise.doc : Doc
  28. lib.base.abilities.Exception.unsafeRun! : '{g, Exception} a ->{g} a
  29. lib.base.abilities.Exception.unsafeRun!.doc : Doc
  30. lib.base.abilities.Throw.toException.doc : Doc
  31. lib.base.Either.toException.doc : Doc
  32. lib.base.math.ArithmeticException.dividedByZero : '{Exception} r
  33. lib.base.math.ArithmeticException.DividedByZero : ArithmeticException
  34. lib.base.math.ArithmeticException.doc : Doc
  35. lib.base.math.ArithmeticException.negativeInfinity : '{Exception} r
  36. lib.base.math.ArithmeticException.NegativeInfinityNotAllowed : ArithmeticException
  37. lib.base.math.ArithmeticException.notANumber : '{Exception} r
  38. lib.base.math.ArithmeticException.NotANumber : ArithmeticException
  39. lib.base.math.ArithmeticException.overflow : '{Exception} r
  40. lib.base.math.ArithmeticException.Overflow : ArithmeticException
  41. lib.base.math.ArithmeticException.positiveInfinity : '{Exception} r
  42. lib.base.math.ArithmeticException.PositiveInfinityNotAllowed : ArithmeticException
  43. lib.base.math.ArithmeticException.underflow : '{Exception} r
  44. lib.base.math.ArithmeticException.Underflow : ArithmeticException

When I run find.global it does show me that there is a M2 namespace in unison's share heirarchy, but it only shows me Doc results from there:

❯ echo "find.global Exception" | INSIDE_EMACS=1 unison -p .share.stew.public.projects.metrics.main | grep M2
  55. .share.unison.public.base.releases.M2.Exception.bracket.doc : Doc
  56. .share.unison.public.base.releases.M2.Exception.catch.doc : Doc
  57. .share.unison.public.base.releases.M2.Exception.catchMany.doc : Doc
  58. .share.unison.public.base.releases.M2.Exception.catchOnly.doc : Doc
  59. .share.unison.public.base.releases.M2.Exception.finally.doc : Doc
  60. .share.unison.public.base.releases.M2.Exception.reraise.doc : Doc
stew commented 1 year ago

In fact this is really the Exception which is my lib.base. However there is no good way to confirm this. To confirm this I had to go find a way to find some namesapce named M2 and find an Exception there, and then use a an absolute path to names .share.unison.public.base.release.M2.Exception

aryairani commented 1 month ago

@stew Would you want a command that prints a definition with hashes only? Or no, maybe a command that prints a definition but includes a table of names to hashes as well? (Somewhat harder to implement, but much more user-friendly.)