J'ai participé à Un concours de programmation et L'un des problèmes de problèmes 'Entrée de données comprenait un nombre de fractionnements dans un format décimal: analyser que dans Lorsque vous essayez d'utiliser cela, j'ai découvert que code> lire code> a Alors, la question est: p>
Le nombre de dépendances externes doit également être pris en compte, car je ne peux pas installer de bibliothèques supplémentaires dans le juge en ligne. P> 0,75 code> est un exemple. < / p>
double code> est trivial (je peux utiliser
lire code> pour cela), mais la perte de précision est douloureuse. Il faut faire très attention avec
Double Code> Comparaisons (je n'étais pas), ce qui semble redondant depuis que l'on a
rationnel code> type de données dans HASKELLL. P>
rationnel code> Il faut fournir une chaîne dans le format suivant:
numérateur% Denominator < / code>, que je n'ai évidemment pas. p>
rationnel code>? strong> p> p>
3 Réponses :
La fonction que vous voulez est numeric.readfloat code>:
Vous voudrez peut-être ajouter lectusigned code> si vous souhaitez pouvoir lire des nombres négatifs:
fst. tête $ lectures lectures "-3,14" :: rationnelle code>
Que diriez-vous de la section suivante (Session GHCI):
> :m + Data.Ratio > approxRational (read "0.1" :: Double) 0.01 1 % 10
C'est une bonne idée! Je pense que cela devrait être utilisé à la place de Tordification code> dans la plupart des cas!
Malheureusement, le choix de Epsilon n'est pas évident ici. Par exemple, environ 0,999 0,0001 code> est
909% 910 code>, ce qui n'est pas ce que je veux. L'epsilon approprié à utiliser dans ce cas est
0.000001 code> (précision carré?)
Peut-être que vous obtiendriez des points supplémentaires dans le concours pour la mettre en œuvre vous-même:
import Data.Ratio ( (%) ) readRational :: String -> Rational readRational input = read intPart % 1 + read fracPart % (10 ^ length fracPart) where (intPart, fromDot) = span (/='.') input fracPart = if null fromDot then "0" else tail fromDot
Je ne le pense pas. Dans de tels concours, seuls le temps de soumission et l'exactitude compte. Belle solution encore, suffisamment courte pour coder en cas d'urgence.