Discussion: adding displayException to Exception class

Andreas Abel abela at chalmers.se
Thu Oct 30 16:20:44 UTC 2014


As you notice, the show functions for collections are implemented 
wrongly, they should print

   Fully.Qualified.Module.fromList [(key,value),...]

High time to repent now and not sin again.

Positive example: 
https://hackage.haskell.org/package/Agda-2.4.0/docs/src/Agda-Utils-BiMap.html#BiMap

On 29.10.2014 23:07, Christopher Done wrote:
> Well, I think |fromList [(1, 'a')]| is kind of unhelpful:
>
>  1. It almost never is a straight copy/paste, you will have to go and
>     add M. to the fromList.
>  2. It doesn’t actually tell you what you’re looking at:
>
> |(fromList [(0,'a'),(1,'b'),(2,'c'),(3,'d'),(4,'e'),(5,'f')]
> ,fromList [(0,'a'),(1,'b'),(2,'c'),(3,'d'),(4,'e'),(5,'f')]
> ,fromList [1,2,3,4,5]
> ,fromList [1,2,3,4,5])
> |
>
> What are you looking at?
>
> Answer:
>
> |>import  qualified  Data.Mapas  M
>>import  qualified  Data.HashMap.Strictas  HM
>>import  qualified  Data.Vectoras  V
>>import  qualified  Data.Vectoras  S
>> (M.fromList (zip [0..5] ['a'..])
>    ,HM.fromList (zip [0..5] ['a'..])
>    ,S.fromList [1..5]
>    ,V.fromList [1..5])
> |
>
> It’s true that numbers (|Int|/|Integer|) get a free pass on this, but
> I consider those an exception. I’d prefer (if we’re restricting
> ourselves to strings) something like
>
> |Map  [(0,'a'),(1,'b'),(2,'c')]
> StrictHashMap  [(0,'a'),(1,'b'),(2,'c')]
> Set  [0,1,2,3,4,5]
> Vector  [0,1,2,3,4,5]
> |
>
> But this is not the status quo and I don’t see it changing
> soon. People are set on the “looks like code” idea more than “describe
> the data structure”.
>
> ------------------------------------------------------------------------
>
> Digression:
>
> While we’re on the subject, I’d like to be able to convert any Haskell
> value to a
> Presentation
> <http://hackage.haskell.org/package/present-1.1/docs/Present-Types.html>
> which
> IDEs and browsers can use to trivially expand data structures lazily,
> like this:
>
> |λ> present (fromJust (fromList [0])) [1..5]
> Just  (List  "[Integer]"  [("Integer", at 0→0),("[Integer]", at 0→1)])
> λ> present (fromJust (fromList [0,0])) (T.pack"hi")
> Just  (Char  "Char"  "'h'")
> λ> present (fromJust (fromList [0,1])) (T.pack"hi")
> Just  (String  "Text"  [("Char", at 0→1→0),("Text", at 0→1→1)])
> λ> present (fromJust (fromList [0]))"hello!"
> Just  (String  "String"  [("Char", at 0→0),("String", at 0→1)])
> λ> present (fromJust (fromList [0,0]))"hello!"
> Just  (Char  "Char"  "'h'")
> λ> present (fromJust (fromList [0,1,0]))"hello!"
> Just  (Char  "Char"  "'e'")
> |
>
> Video of Emacs taking advantage of this output.
> <https://www.youtube.com/watch?v=oJhIvHtflbI>
>
> And to be able to choose /how to present/ the structure. E.g. if I
> wanted, I could present a |Set| like:
>
> |{0  1  2  3  4  5}
> |
>
> and a |Map| like:
>
> |{0  => 'a',1  => 'b',2  => 'c' }
> |
>
> and, let’s say I add a |Tree| constructor to the |Presentation| type,
> i.e. a known “tree-ish” structure, then I can render a |Data.Tree| like:
>
> |          {0  1  2  3}
>          /         \
>      {4  5  6}     {7  8  9}
>         …            …
> |
>
> Where the |…| is an expansion thing to click. Because |Presentation|
> contains type information, you can hover your mouse or whatever to
> inspect the types of things.
>
> But making this work in the general sense has been hard: Show is not
> parseable, many data types in real projects are not instances of Data
> (and types like Text and Vector have bogus instances). I believe my
> only recourse will be using the GHC API to inspect data types or
> template-haskell’s |reify| in an effort to cross module
> encapsulation. Now that Typeable is not user-definable, one cannot use
> the derive <http://hackage.haskell.org/package/derive> package,
> either. I think the |:sprint|/|:print| of GHCi is sort of there, but
> using it would be more hacky — it would be better to hook into
> whatever API is used to produce that feature in GHC and spit out a
> |Presentation|.
>
> In general, it seems the current Haskell state of affairs makes it
> tricky to just print a value and expand it incrementally in the same
> way that you can in Common Lisp or JavaScript.
>
>>
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>


-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Department of Computer Science and Engineering
Chalmers and Gothenburg University, Sweden

andreas.abel at gu.se
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Libraries mailing list