[HN Gopher] Abacist - Calculations with non-decimal units and mi...
___________________________________________________________________
Abacist - Calculations with non-decimal units and mixed bases in
Scala
Author : cbeach
Score : 28 points
Date : 2024-11-25 22:43 UTC (5 days ago)
(HTM) web link (soundness.dev)
(TXT) w3m dump (soundness.dev)
| btbuildem wrote:
| OP you may have meant to have linked directly to
| https://soundness.dev/abacist
|
| Not a scala person, but I like the idea of being able to shift
| between unit/measurement systems. Lots of strange little edge
| cases. Eg, how does rounding work in imperial, can I get
| 3.1415926535 meters to the closest 1/64th of an inch?
| cbeach wrote:
| ah that's strange - I thought I had linked correctly. And now
| it's too late to edit :-(
| TOGoS wrote:
| This seems similar to the 'ComplexAmount' system I used to use in
| PHP and JavaScript programs for representing measurements using
| mixed units. Basically just a map of unit code => quantity. And
| for extra exactness, quantity would be represented as a rational
| number.
|
| Was useful for a client that let you place orders using a mixture
| of USD and CAD (the alternative being a lot of
| 'canada'/'canadian'/'cad' fields added willy-nilly everywhere a
| cost needed to be represented; I don't know how people can stand
| to program that way). But also for generating G-code for a CNC
| router [1], when sometimes you want to model in mm, and sometimes
| in inches, and keep all the numbers exact until the last possible
| moment.
|
| [1] https://github.com/TOGoS/TTSGCG
| nadavwr wrote:
| PHP and JavaScript are dynamic. Here you'll be able to pass
| distances as feet or meters, but if you try to pass in pounds
| you'll get a compile time error -- can't do that in dynamic
| languages :)
| TOGoS wrote:
| So, when I said JavaScript, I really meant TypeScript, and I
| found its gradual/structural typing system to be the most
| ergonomic type system I've ever used (if you want nominal
| types, it's pretty trivial to get there just by adding a
| compile-time-only tag, like `{ typeName?: "FooType" }`).
|
| In this case, the TypeScript approach might be something like
| const distanceInMm : {"mm": Rational} =
| toMm(distanceInArbitraryUnits);
|
| You can get as specific as you want, without having to
| wrap/unwrap anything, or even define a new named type. [1]
|
| I think I like Scala conceptually--when people talk about it
| I think "yeah, good idea!"--but every time I've looked at
| Scala code it struck me as having an excessive amount of
| boilerplate to wrap/unwrap stuff just to make the type
| checker happy.
|
| The other bad-tasting thing about Scala is that I wrote a
| program[2] in it many years ago and then later came back to
| try to fix some bugs and the language had changed so much
| that I had to find some old version of it + an old JVM and
| Dockerize it. Docker's a godsend for this sort of thing, but
| kind of inconvenient for development.
|
| [1] My notes about this approach in TypeScript:
| https://www.nuke24.net/plog/32.html
|
| [2] https://github.com/TOGoS/PicGrid
___________________________________________________________________
(page generated 2024-11-30 23:01 UTC)