0votos

Convertir número decimal a fracción en Haskell

por josejuan hace 2 años

Otra

Con un método o función, que devuelva la fracción como un string numerador/denominador

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-- Los escalares pueden racionalizarse directamente usando `toRational` 
-- con firma: 
-- 
--      toRational :: Real a => a -> Rational 
-- 
 
-- Una implementación sencilla y directa podría ser 
toRatio :: RealFrac a ⇒ a → ℚ 
toRatio x = head [round q :% round p 
                    | p ← (10^) ↥ [0 …] 
                    , let q = x × p 
                    , (snd ∘ properFraction) q ≡ 0] /1 
 
 
-- Sin embargo, para poder racionalizar cualquier otra estructura 
-- como por ejemplos números complejos, habría que independizar la 
-- implementación, por ejemplo 
class Racionalizable f where 
  racionalizado :: RealFrac a ⇒ f a → f ℚ 
 
 
-- Por ejemplos ahora podemos racionalizar números complejos como 
instance Racionalizable Complex where 
  racionalizado (x ⅈ y) = toRatio x ⅈ toRatio y 
 
-- O un vector 
instance Racionalizable Vector where 
  racionalizado = ↥toRatio 
 
-- Matrices 
instance Racionalizable Matrix where 
  racionalizado = ↥toRatio 
 
-- etc... 
 
 
{- 
 
  Por ejemplo un nº complejo, un vector y una matriz racionalizadas 
 
> racionalizado (4.128 :+ 1.342) 
516 % 125 :+ 671 % 500 
 
> racionalizado $ V.fromList [4.128, 1.342, 8.31] 
[516 % 125,671 % 500,831 % 100] 
 
> racionalizado $ M.fromList 2 2 [4.128, 1.342, 8.31, 0.9] 
( 516 % 125 671 % 500 ) 
( 831 % 100    9 % 10 ) 
 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.