-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Eq docs #1788
Add Eq docs #1788
Conversation
Codecov Report
@@ Coverage Diff @@
## master #1788 +/- ##
==========================================
+ Coverage 94.87% 95.54% +0.67%
==========================================
Files 241 248 +7
Lines 4139 4426 +287
Branches 103 116 +13
==========================================
+ Hits 3927 4229 +302
+ Misses 212 197 -15
Continue to review full report at Codecov.
|
"Hello" =!= "World" | ||
``` | ||
|
||
Implementing `Eq` instances yourself for every data type might seem like huge drawback compared to only slight gains of typesafety. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we could mention fromUniversalEquals
which should work fine for case classes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not sure this should go in the documentation, but I recently found this useful:
implicit def productEq[A <: Product]: Eq[A] = Eq.fromUniversalEquals
unless I'm missing something (and if so, please let me know!) fromUniversalEqual
should work fine with any Product
. This makes it incredibly easy for the users to provide a reasonable Eq
instance for every case class.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's pretty interesting, seems like it would work for all case classes! Any known downsides?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not that I know. We're using it in a project since a few weeks and so far so good.
That said, I'm far from being an expert :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree it's worth mentioning in the documentation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
docs/src/main/tut/typeclasses/eq.md
Outdated
Foo(10, "") === Foo(10, "") | ||
``` | ||
|
||
You can even go one step further and make use of the fact, that every case class will extend `scala.Product`, by creating an `Eq` instance for it. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this mechanism is probably good enough for all Product
, so it doesn't limit to case classes. How about:
You can even go one step further by making this implicitly available for all scala.Product
(which include case classes).
implicit def eqProduct[A <: Product]: Eq[A] = Eq.fromUniversalEquals
docs/src/main/tut/typeclasses/eq.md
Outdated
|
||
# Eq | ||
|
||
Show is an alternative to the standard Java `equals` method. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
s/Show/Eq
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Whooops!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks! 👍
docs/src/main/tut/typeclasses/eq.md
Outdated
|
||
case class Bar(a: Double, b: Int) | ||
|
||
implicit def eqProduct[A <: Product]: Eq[A] = Eq.fromUniversalEquals |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry to disagree with a couple of other commenters, but personally I wouldn't be too inclined to include this example in the docs. A couple of significant difference between this and kittens derivation is that kittens will only derive the Eq
instance when all types within the case class have Eq
instances, and it will be consistent with those individual Eq
instances, while this relies on universal equality so it won't necessarily.
I like the fromUniversalEquals
method and use it on occasion, but I think it's a big leap to add this instance into implicit scope for all Product
types. I don't want to be a stick in the mud though, so if others want to go forward with this in the docs, that's okay.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that's a really good point. It didn't come to my mind that fromUniversalEquals wont recursively use Eq
for fields. Agree we should remove this example usage.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yet some more wonderful documentation from @LukaJCB!
Adds some basic documentation for
Eq
. I'm not sure if this is enough, or if more would complicate things and turn off users, would love to hear some feedback :)