typelevel / spire

Powerful new number types and numeric abstractions for Scala.
http://typelevel.org/spire/
MIT License
1.76k stars 242 forks source link

cleaner typeclass instances for `Fractional` #1306

Closed erikerlandson closed 6 months ago

erikerlandson commented 6 months ago

I need a clean way to express the following ideas for spire types, via typeclasses:

1) Some types are "fractional" - they can approximate all their answers "closely" (for some value of "close") in a fractional way:

2) for all native and spire types that are fractional, one can compute a "good" approximation (again, for some value of "good") for fpow and nroot

I think a clean way to do this would be to simply define actual typeclass instances of Fractional for all these types. That gives library users a clean way to say either using NRoot or using Fractional in their signatures.

Currently spire provides literally no usable typeclass instance of NRoot[Rational], even though it provides instances for several integral types like NRoot[Int], which doesn't seem numerically safe at all!

There are also currently no typeclass instances that allow one to "filter" on numeric types that actually are fractional. I should be able to say things like using Fractional[V] and have this be satisfiable for Float, Double, Rational, BigDecimal, etc. Currently that doesn't seem possible.

erikerlandson commented 6 months ago

This should give me what I want, thanks @armanbilge

https://github.com/typelevel/spire/blob/1006dbf6b5e3122bfc234f6e05a3b6b532ab0f70/core/src/main/scala/spire/math/Fractional.scala#L25-L30