haskell / aeson

A fast Haskell JSON library
Other
1.26k stars 321 forks source link

Add Data.Complex instances #1091

Open TravisWhitaker opened 7 months ago

TravisWhitaker commented 7 months ago

There are loads of utility functions for defining the included instances. I guessed at which ones should be used for Data.Complex, but if I guessed incorrectly please say so.

I used a two-element array as the representation because that's how I've seen APIs in the wild do it, but perhaps {i : ..., q : ...} or {real : ..., imag : ...} would be preferred?

TravisWhitaker commented 1 week ago

@phadej any thoughts on this?

phadej commented 1 week ago

I'd pick {real : ..., imag : ...}, it will be analogous to Ratio. Also add FromJSON1 and ToJSON1 instance. Ratio doesn't have those, as it has an invariant, but Complex is really just a homogeneous pair (yet the common use case as number could be confusing when encoding as just a pair).

EDIT: I made a quick google, and it doesn't seem that there is an agreement to how encode complex numbers in JSON, so having more self-explanatory encoding is better.

TravisWhitaker commented 9 hours ago

Ah, sorry for missing *JSON1.

I'm curious what you'd think of having {real : ..., imag : ...} as the default instance, and then providing instances for the other two common ways via newtype instances (similar to the existing DotNetTime newtype).

phadej commented 2 hours ago

(similar to the existing DotNetTime newtype).

Not worth the trouble.