Comments (4)
I like it.
from zio-prelude.
I'm a little worried about this. While being able to aggregate with double or float values is certainly useful they don't satisfy the laws and defining instances for them is going to result in derived instances involves them that also aren't lawful in ways that may be less obvious. I agree it would be nice to do something here and I'm not sure what the solution is but this seems like it could be another area where we could potentially do something different than other libraries have done here.
Another related thing that is I think less controversial is instances that are lawful but aren't testable. For example, function composition is closed for functions A => A
, but we can't test it because it is not possible to define equality for functions. Perhaps we could use some notion of "equality to the extent of testability" here. For example, two functions are equal as far as we can tell if they return identical outputs for a random sample of inputs.
from zio-prelude.
I think we need some form of "special" treatment here. For lawless instances perhaps pull them out into separate package? 😕
from zio-prelude.
If you look at Scalaz and Cats, both excluded the instances, and pushed them into another package (outlaws / alleycats). This made it (a) still possible to access for the determined user, albeit as orphan instances, and (b) more painful for common case when violations of laws affect correctness only in "small" ways (e.g. associativity of float / double addition / multiplication—which affects accuracy of the result, but so do all calculations involving floats / doubles).
My feeling is that this design choice (to force illegal instances to be orphans in a third-party library) is thoroughly explored in other FP libraries. There is a lot of convenience in being able to, e.g. call foldMap
on a foldable of doubles, and get back a sum, even if the answer is different depending on whether the implementation folds from the left or from the right (and it shouldn't be, according to laws).
Will this break some generic code in mild ways? Yes, but only for people using floats / doubles generically. And if you're doing that, there's probably a reason (e.g. performance, since these types are way faster than rational types), and you are probably willing to pay the consequences.
from zio-prelude.
Related Issues (20)
- Add implementation of Free HOT 2
- Newtypes: Composed assertions on String values do not work at compile time HOT 3
- typeclass instances for zio.Config HOT 1
- [Scala 2.13] Subtype of Newtype cause cyclic subtyping error HOT 19
- Broken forEach on CovariantIdentityBoth
- java.lang.NoSuchMethodError MyType$.$anonfun$assertion$1$adapted(Ljava/lang/Object;)Lscala/util/Either;
- make-macro behaves unexpectedly with jsoniter-scala HOT 2
- Split out Newtype+Subtype functionality to separate, smaller library HOT 6
- Custom error message for Assertion HOT 2
- Incorrect debug value for java.util.concurrent.TimeUnit.MINUTES
- The `abstraction-diagrams` ID Doesn't Exist HOT 3
- Check Website Build Before Publishing The Documentation Project
- Change scope of ClassTagWrapper in NewType to public?
- `.wrapAll` for multi-type types
- Problem with `===` and Slick
- NonEmptySet#removeNonEmpty is does not remove the requested item
- Extension methods on NewType not working since 1.0.0RC16 HOT 1
- SortedSet syntax
- ZEnvironment#prune doesn't work with newtypes on scala 2 HOT 2
- Dead «Edit this page» link on https://zio.dev/zio-prelude/
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from zio-prelude.