If we have a type system, we will 100% warn in those cases. :) crossing
fingers.

On Fri, Mar 3, 2023 at 17:26 Marc-André Lafortune <marc-an...@marc-andre.ca>
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?
> 😆
>
> 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/CAGnRm4%2BLEKtB9ShTiPpgUBV4%2BAmML3r7ozurd2q3Eu7kOT2OoQ%40mail.gmail.com.

Reply via email to