7
votes

Mise en œuvre d'une valeur mesurée dans SCALA

Une valeur mesurée comprend un numéro de point flottant (typiquement non négatif) et une unité de mesure. Le but est de représenter des quantités réelles et des règles qui les gouvernent. Voici un exemple:

scala> val oneinch = Measure(1.0, INCH)
oneinch : Measure[INCH] = Measure(1.0)
scala> val twoinch = Measure(2.0, INCH)
twoinch : Measure[INCH] = Measure(2.0)
scala> val onecm = Measure(1.0, CM)
onecm : Measure[CM] = Measure(1.0)
scala> oneinch + twoinch
res1: Measure[INCH] = Measure(3.0)
scala> oneinch + onecm
res2: Measure[INCH] = Measure(1.787401575)
scala> onecm * onecm
res3: Measure[CMSQ] = Measure(1.0)
scala> onecm * oneinch
res4: Measure[CMSQ] = Measure(2.54)
scala> oncem * Measure(1.0, LITER)
console>:7: error: conformance mismatch
scala> oneinch * 2 == twoinch
res5: Boolean = true


4 commentaires

Pourquoi obtenez-vous une inadéquation de conformité lors de la multiplication d'une longueur et d'un volume? Pourquoi n'est-ce pas juste une unité dans m ^ 4 ?


bonne attrape oxbow. Peut-être qu'il voulait utiliser un signe plus ou moins?


Non, je saisis juste pour un exemple d'incommensurabilité. Je suppose que m ^ 4 est théoriquement approprié, bien qu'aucune utilisation pour cela ne soit facile à l'esprit. Comme l'a souligné I82Mutant, la longueur de la longueur du volume serait un meilleur exemple.


J'y ai pensé moi-même. Vous pouvez certainement mettre en œuvre cela dans SCALA, ainsi que des conversions implicites entre les unités et ce qui n'est pas. Ce que je n'ai pas pu concevoir est une syntaxe qui s'approche de celui de celui de F # (sans changer la langue Scala).


6 Réponses :


11
votes

f # a prise en charge, voir par exemple Ce lien pour une introduction. Il y a eu des travaux sur Scala sur des unités, par exemple Ici et ici . Il existe également un plug-in Scala Compiler, comme décrit dans Ce blog post . J'ai brièvement essayé de l'installer, mais à l'aide de Scala 2.8.1, j'ai eu une exception lorsque j'ai démarré le repli, donc je ne sais pas si ce plugin est activement maintenu pour le moment.


1 commentaires

J'ai essayé le plugin des unités Scala et il n'a pas fonctionné en 2.9 non plus



5
votes

Votre question est entièrement répondue avec un mot. Vous pouvez me remercier plus tard.

frink. http://futureboy.us/frinkdocs/


0 commentaires

5
votes

Eh bien, cette fonctionnalité existe en Java, ce qui signifie que vous pouvez l'utiliser directement dans SCALA.

JSR-275 , qui a été déplacé vers Code Google . jscience implémente la spécification. Voici un bon Introduction . Si vous voulez une meilleure interface, j'utiliserais cela comme base et construire une enveloppe autour de celle-ci.


1 commentaires

Merci, c'est exactement ce que je cherchais. Et étant donné que je devinais très près de la terminologie correcte, merci également de ne pas me donner un lien LMGTFY.



1
votes

FYI, j'ai développé une classe scalaire dans Scala pour représenter des unités physiques. Je l'utilise actuellement pour mes travaux de R & D dans le contrôle de la circulation aérienne et cela fonctionne bien pour moi. Il ne vérifie pas la cohérence des unités au moment de la compilation, mais elle vérifie au moment de l'exécution. J'ai un schéma unique pour le remplacer facilement avec des types numériques de base pour l'efficacité après l'exécution de l'application. Vous pouvez trouver le code et le guide de l'utilisateur à

http://russp.us/scalar-scala.htm

Voici le résumé du site Web:

Résumé - Une classe Scala a été conçue pour représenter des scalaires physiques et éliminer les erreurs impliquant des unités physiques implicites (par exemple, des radians et des degrés confus). Les opérateurs arithmétiques standard sont surchargés pour fournir une syntaxe identique à celle des types numériques de base. La classe scalaire elle-même ne définit aucune unité mais fait partie d'un emballage comprenant une mise en œuvre complète du système métrique standard d'unités et de nombreuses unités non métriques communes. Le package scalaire permet également à l'utilisateur de définir un ensemble spécialisé ou réduit d'unités physiques pour toute application ou domaine particulière. Une fois qu'une application a été développée et testée, la classe scalaire peut être désactivée au moment de la compilation pour obtenir l'efficacité d'exécution des opérations sur des types de base numériques, qui sont un ordre de grandeur plus rapide. La classe scalaire peut également être utilisée pour des unités discrètes pour appliquer la vérification de type de type de comptes entier, améliorant ainsi la vérification de type statique de SCALA avec une vérification de type dynamique supplémentaire.


3 commentaires

A l'air sympa, mais la vérification dynamique n'est pas vraiment celle que vous voudriez.


Ouais, Logiciel ATC avec vérification du type d'exécution? Je peux voir les titres maintenant: "Vol 34 abattu par conversion de mètre / jardin" ...


Ouais, Logiciel ATC avec vérification du type d'exécution? Je peux voir des titres maintenant: "Vol 34 abattu par une conversion de mètre / jardin".



0
votes

"Ouais, Software ATC avec vérification du type de temps d'exécution? Je peux voir les titres maintenant:" Vol 34 abattu par la conversion du mètre / de la cour "".

Désolé, mais vous ne savez pas de quoi vous parlez. Le logiciel ATC est testé pour Years avant qu'il ne soit déployé. C'est assez de temps pour attraper des erreurs d'incohérence.

Plus important encore, les conversions de mètre / de jardin ne sont même pas une question ici. Ces types d'erreurs sont automatiquement traités simplement en utilisant ma classe scalaire. Pour ce genre d'erreurs, vous n'avez besoin ni statique ni vérification dynamique. La question de la vérification statique et dynamique ne propose que pour les incohérences de l'unité, comme dans l'ajout de la longueur. Ces types d'erreurs sont moins courantes et sont généralement capturées avec une vérification dynamique sur le premier test.

Au fait, l'interface ici est terrible.


3 commentaires

L'interface sera meilleure une fois que vous obtenez des points de réputation et que le système vous fait confiance. Vous pouvez le faire en publiant des réponses qui répondent réellement à la question posée. Plus d'infos Ici: Stackoverflow.com/faq


@RObert - Russ a été victime d'un bogue spécifique dans le logiciel Stackexchange: lors de la rédaction d'une réponse , la touche Entrée entraîne une nouvelle ligne dans le texte; Lorsque vous écrivez un commentaire , cela soumet le commentaire.


Je ne connais certainement rien à propos du logiciel ATC, mais je connais une chose ou deux sur des logiciels en général, et je sais que les tests ne sont pas de panacée. Consultez ma question originale pour un exemple d'un système "Testé pour ans avant son déploiement" ayant néanmoins un bug qui a entraîné la perte du navire et de la mission. Même si c'était efficace, les tests ont des problèmes énormes. La FAA s'est battue depuis des décennies pour remplacer son système hôte âgé de 40 ans avec le système d'iram unique légèrement obsolète et parmi ses 10 premiers problèmes.



1
votes

Permettez-moi de clarifier mon post précédent. J'aurais dû dire: "Ces types d'erreurs [" erreurs de conversion de mètre / jardin "] sont automatiquement évitées (non" manipulées ") en utilisant simplement ma classe scalaire. Toutes les conversions d'unité sont effectuées automatiquement. C'est la partie facile.

La partie plus difficile est la vérification des incohérences de l'unité, telles que l'ajout d'une longueur à une vitesse. C'est ici que la question de la vérification du type statique dynamique vs statique se présente. Je conviens que la vérification statique est généralement préférable, mais seulement si cela peut être fait sans sacrifier la convivialité et la commodité.

J'ai vu au moins deux "projets" pour la vérification statique des unités, mais je n'ai jamais entendu parler de personne qui les utilise réellement pour un travail réel. Si quelqu'un connaît un cas où ils ont été utilisés, merci de me le faire savoir. Jusqu'à ce que vous utilisiez un logiciel pour un travail réel, vous ne savez pas quels types de problèmes vont venir.

Comme je l'ai écrit ci-dessus, j'utilise actuellement ma classe scalaire (http://russp.us/scalar-scala.htm) pour mes travaux de recherche et développement dans ATC. J'ai dû faire de nombreux ajustements en cours de convivialité et de commodité, mais cela fonctionne bien pour moi. Je serais prêt à envisager une mise en œuvre des unités statiques si une épreuve prouvée, mais pour l'instant, je pense que j'ai essentiellement 99% de la valeur d'une telle chose. Hé, la grande majorité des scientifiques et des ingénieurs utilisent simplement des "doubles", tellement me couper du mou!


1 commentaires

Bonjour Russ, ce ne sont pas des "postes" mais sont en réalité des réponses à la question. Ils ont voté pour que de bonnes réponses bulles au sommet. Si vous souhaitez clarifier votre réponse précédente, vous voudrez peut-être le modifier à la place, mais étant donné que cette réponse a plus de votes, je suggérerais d'ajouter ces changements dans celui-ci afin de ne pas perdre de points. Pris ensemble, vous avez une très bonne réponse! Stackoverflow n'est pas comme un forum normal. Vous voudrez peut-être jeter un coup d'œil à la FAQ: Stackoverflow.com/faq