I makes sense to not compare decimals and floats but maybe compare accepts decimals and integers?
On Sat, Mar 4, 2023 at 10:39 Sabiwara Yukichi <sabiw...@gmail.com> wrote: > Also, even Decimal.compare/2 choses to support this which comforted me > with this decision: > > iex> Decimal.compare(Decimal.new(2), 1.0) > ** (ArgumentError) implicit conversion of 1.0 to Decimal is not allowed. > Use Decimal.from_float/1 > > Le sam. 4 mars 2023 à 18:34, Sabiwara Yukichi <sabiw...@gmail.com> a > écrit : > >> Thank you José for the feedback! >> >> I considered this point, and although it would be ideal, I decided to >> consider this case an acceptable trade-off not to handle it, because: >> 1. it would make the implementation much more complex as pointed out >> 2. it would remove a lot of potential for optimizations >> 3. it might not be such a common huge case, because programs tend to work >> with a given type, mixing them is not so common >> >> I'm a) guarding against number-decimal comparisons and b) handling >> semantic decimal-decimal comparisons, which should cover the two main >> pitfalls with decimals in my experience: >> >> iex> max(Decimal.new(2), Decimal.from_float(1.0))#Decimal<1.0> >> >> iex> Cmp.max(Decimal.new(2), Decimal.from_float(1.0))#Decimal<2> >> >> iex> Cmp.max(Decimal.new(2), 1.0) >> ** (Cmp.TypeError) Failed to compare incompatible types - left: #Decimal<2>, >> right: 1.0 >> >> >> Le sam. 4 mars 2023 à 17:00, José Valim <jose.va...@dashbit.co> a écrit : >> >>> We had discussions in the past and the issue with a Comparable protocol >>> is that we need multiple dispatch. For example, we should be able to >>> semantically compare "Integer cmp Decimal" and "Decimal cmp Integer" which >>> is a more complex problem as it requires defining a scale to compare all of >>> them. Then you can add a compare numbers functionality that converts them >>> to said scale using a separate protocol. It will still require at least two >>> protocol dispatches. >>> >>> On Sat, Mar 4, 2023 at 7:32 AM Sabiwara Yukichi <sabiw...@gmail.com> >>> wrote: >>> >>>> > It's great that there exists a total order (structural) in >>>> Elixir/Erlang, I just wish it wasn't accessible with `<`, `>`, as it is too >>>> error prone and is simply never what one wants to do (at least in our app). >>>> Elixir 2.0? 😆 >>>> >>>> (another shameless plug) Your comment motivated me to release this >>>> project I was working on: https://github.com/sabiwara/cmp. >>>> Feedback welcome :) >>>> >>>> Le sam. 4 mars 2023 à 01:26, Marc-André Lafortune < >>>> marc-an...@marc-andre.ca> a écrit : >>>> >>>>> It's great that there exists a total order (structural) in >>>>> Elixir/Erlang, I just wish it wasn't accessible with `<`, `>`, as it is >>>>> too >>>>> error prone and is simply never what one wants to do (at least in our >>>>> app). >>>>> Elixir 2.0? 😆 >>>>> >>>>> At work I just recently overloaded them to raise unless both arguments >>>>> are `is_number`, and we found bugs where we were comparing Decimals, and >>>>> other bugs where we were comparing with `nil`. They are no longer allowed >>>>> in guards too. >>>>> >>>>> On Friday, 3 March 2023 at 09:31:28 UTC-5 william.l...@cargosense.com >>>>> wrote: >>>>> >>>>>> > if I’m remembering `DateTime.compare/2` correctly >>>>>> >>>>>> Close! The `Module.compare/2` functions return one of `:lt`, `:eq`, >>>>>> or `:gt` ("less than", "equal to", "greater than"), similar to what >>>>>> Haskell >>>>>> does. You may have been thinking of something like OCaml where `compare` >>>>>> returns `-1`, `0`, or `1` resp. >>>>>> >>>>>> > So Why don't we implicitly sort it so that it can be compared by >>>>>> inequality sign(> or <)? >>>>>> >>>>>> To clarify, functions like `<` *define* the sort order. >>>>>> >>>>>> Any time you sort a list, you're using a function that compares two >>>>>> elements. Even if you call `Enum.sort/1`, you're implicitly using `<=/2` >>>>>> as >>>>>> the comparison function. If you want some other sort order, e.g. for >>>>>> semantic ordering of `DateTime`s, then you must supply your own >>>>>> comparison >>>>>> function. >>>>>> >>>>>> The reason that you can use `<` on structs with `CompareChain` is >>>>>> that it uses macros to re-write an expression like >>>>>> >>>>>> `~D[2023-03-03] < ~D[2023-03-04]` >>>>>> >>>>>> as >>>>>> >>>>>> `Date.compare(~D[2023-03-03], ~D[2023-03-04]) == :lt`. >>>>>> >>>>>> But that doesn't change the behavior of `<` itself. We're basically >>>>>> stuck with what `<` and the like do. Though as José points out, that's >>>>>> actually a good thing. >>>>>> >>>>>> (Side note, you actually have to call `compare?(~D[2023-03-03] < >>>>>> ~D[2023-03-04], Date)` with `CompareChain` to invoke the re-write. I just >>>>>> wanted the example to be more readable.) >>>>>> On Friday, March 3, 2023 at 3:27:00 AM UTC-5 José Valim wrote: >>>>>> >>>>>>> It is also important to note that both kinds of comparisons are >>>>>>> important to have in a language. The docs for main discuss this: >>>>>>> https://hexdocs.pm/elixir/main/Kernel.html#module-structural-comparison >>>>>>> >>>>>>> On Fri, Mar 3, 2023 at 7:47 AM Austin Ziegler <halos...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> In this case, because Elixir is passing the `<` and `>` comparisons >>>>>>>> to the underlying BEAM operations and there’s no overloading to say >>>>>>>> that >>>>>>>> `left < right` should mean `DateTime.compare(left, right) < 0` and >>>>>>>> `left > >>>>>>>> right` should mean `DateTime.compare(left, right) > 0` (if I’m >>>>>>>> remembering >>>>>>>> `DateTime.compare/2` correctly). >>>>>>>> >>>>>>>> `CompareChain` does that, but it’s something that gets opted into. >>>>>>>> >>>>>>>> -a >>>>>>>> >>>>>>>> On Thu, Mar 2, 2023 at 10:42 PM 최병욱 <cbw...@gmail.com> wrote: >>>>>>>> >>>>>>>>> So Why don't we implicitly sort it so that it can be compared by >>>>>>>>> inequality sign(> or <)? >>>>>>>>> >>>>>>>>> 2023년 3월 3일 금요일 오전 10시 3분 25초 UTC+9에 william.l...@cargosense.com님이 >>>>>>>>> 작성: >>>>>>>>> >>>>>>>>>> Shameless plug: I wrote a library called `CompareChain` that >>>>>>>>>> allows you to use operators like `<` and `>` on structs like >>>>>>>>>> `DateTime`. >>>>>>>>>> >>>>>>>>>> Hexdocs: https://hexdocs.pm/compare_chain/readme.html >>>>>>>>>> >>>>>>>>>> On Thursday, March 2, 2023 at 10:54:08 AM UTC-5 Jay Rogov wrote: >>>>>>>>>> >>>>>>>>>>> Because the underlying structure used to represent DateTime is a >>>>>>>>>>> struct, which is simply a map under the hood. >>>>>>>>>>> Erlang/Elixir uses a rather arbitrary order of keys (e.g. hour >>>>>>>>>>> -> year -> day -> minute) when comparing 2 maps which you can't >>>>>>>>>>> control. >>>>>>>>>>> >>>>>>>>>>> Thus, you need to have a specific function that would compare >>>>>>>>>>> these structs according to implied field order (year -> month -> >>>>>>>>>>> day -> >>>>>>>>>>> hour -> etc.) >>>>>>>>>>> >>>>>>>>>>> More: >>>>>>>>>>> https://hexdocs.pm/elixir/main/NaiveDateTime.html#module-comparing-naive-date-times >>>>>>>>>>> >>>>>>>>>>> On Thursday, 2 March 2023 at 4:38:00 pm UTC+1 cbw...@gmail.com >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Can't you compare DateTime with '>' or '<' instead of >>>>>>>>>>>> DateTime.compare? >>>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "elixir-lang-core" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to elixir-lang-co...@googlegroups.com. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/afa3830a-8944-4e12-84cc-d8e28d9fceb0n%40googlegroups.com >>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/afa3830a-8944-4e12-84cc-d8e28d9fceb0n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>> . >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Austin Ziegler • halos...@gmail.com • aus...@halostatue.ca >>>>>>>> http://www.halostatue.ca/ • http://twitter.com/halostatue >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "elixir-lang-core" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to elixir-lang-co...@googlegroups.com. >>>>>>>> >>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/CAJ4ekQuHMtqrAVs-kwCo4NQC7vyWV3O8RpAm3c6tgDoiVa%2B5bw%40mail.gmail.com >>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAJ4ekQuHMtqrAVs-kwCo4NQC7vyWV3O8RpAm3c6tgDoiVa%2B5bw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "elixir-lang-core" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to elixir-lang-core+unsubscr...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/elixir-lang-core/c6f42de3-7132-4a8b-b3fa-4e7b0db67ce2n%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/elixir-lang-core/c6f42de3-7132-4a8b-b3fa-4e7b0db67ce2n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "elixir-lang-core" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to elixir-lang-core+unsubscr...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/elixir-lang-core/CANnyohaRZY_ZRkQ%2BuOP5oHtOTW%3Dwy6vzSNvPiYXT%3D7HP0M2T-g%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/elixir-lang-core/CANnyohaRZY_ZRkQ%2BuOP5oHtOTW%3Dwy6vzSNvPiYXT%3D7HP0M2T-g%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "elixir-lang-core" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to elixir-lang-core+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LvGV9Ph2qFZScYmmuB211Rc2%3DbuNfZFKApk1pXfNU1%2Bg%40mail.gmail.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LvGV9Ph2qFZScYmmuB211Rc2%3DbuNfZFKApk1pXfNU1%2Bg%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to elixir-lang-core+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/CANnyohYEL_SsUQ%2B_3ckQ0wRffie4qF41fKjpA60xNhg75tDJuw%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CANnyohYEL_SsUQ%2B_3ckQ0wRffie4qF41fKjpA60xNhg75tDJuw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JMWVpMRrp1YdLLjUvE%3D6-2NVOmbBU3fdS-hh%2B5sqo8WA%40mail.gmail.com.