0votos

Bucles en Haskell

por josejuan hace 3 años

Se aplica una solución para cualquier tipo y cantidad de estadísticos y después se añaden como caso particular los solicitados en el desafío.

Se hace en pyhton, facil, con lenguage simple, los numeros espues de las x son los elevados....

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
{-# LANGUAGE ExistentialQuantification, TupleSections #-} 
import Control.Monad 
import Control.Applicative 
 
 
-- Se permite computar cualquier tipo de estadístico 
class Statistic x where 
    fromValue :: 𝔻 β†’ x        -- Crea un estadístico a partir de un único valor 
    append    :: x β†’ x β†’ x    -- Concatena dos estadísticos 
    getValue  :: x β†’ 𝐌 𝔻      -- Obtiene (si es posible) el valor del estadístico 
    getName   :: x β†’ 𝐒        -- Devuelve el nombre del estadístico 
 
-- Para poder operar con listas heterogéneas de estadísticos 
data St = βˆ€ s ∘ Statistic s β‡’ St s 
 
-- Dada una lista de estadísticos y valores, actualiza los primeros aplicando los segundos 
computeStatistics :: [St] β†’ [𝔻] β†’ [St] 
computeStatistics = foldr (map ∘ flip add) 
                    where add (St s) = St ∘ append s ∘ fromValue 
 
-- (hasta aquí el soporte para calcular estadísticas de cualquier tipo) 
 
 
 
 
 
-- == Se añaden los estadísticos solicitados ====================================== 
 
-- El mínimo 
newtype StMin = StMin { stMin :: 𝐌 𝔻 } 
instance Statistic StMin where 
    getName _ = "Minimum" 
    fromValue = StMin ∘ 𝐽 
    getValue  = stMin 
    append (StMin a) (StMin b) = StMin $ maybe2 min a b 
 
-- El máximo 
newtype StMax = StMax { stMax :: 𝐌 𝔻 } 
instance Statistic StMax where 
    getName _ = "Maximum" 
    fromValue = StMax ∘ 𝐽 
    getValue  = stMax 
    append (StMax a) (StMax b) = StMax $ maybe2 max a b 
 
-- La media 
newtype StAvg = StAvg { stAvg :: 𝐌 (𝔻, 𝔻) } 
instance Statistic StAvg where 
    getName _ = "Average" 
    fromValue = StAvg ∘ 𝐽 ∘ (1,) 
    getValue x = do (n, s) ← stAvg x 
                    Ξ· (s / n) 
    append (StAvg a) (StAvg b) = StAvg $ maybe2 (Ξ»(i, u) (j, v) β†’ (i + j, u + v)) a b 
 
-- La desviación estándar 
newtype StDev = StDev { stDev :: 𝐌 (StAvg, StAvg) } 
instance Statistic StDev where 
    getName _ = "Deviation" 
    fromValue x = StDev $ 𝐽 (fromValue x, fromValue (x²)) 
    getValue x = do  (sx, sx2) ← stDev x 
                     x         ← getValue sx 
                     x2        ← getValue sx2 
                     Ξ· $ √( x2 - x × x ) 
    append (StDev a) (StDev b) = StDev $ maybe2 (Ξ»(i, u) (j, v) β†’ (i `append` j, u `append` v)) a b 
 
-- O uno o el otro o la combinación de ambos 
maybe2 :: (a β†’ a β†’ a) β†’ 𝐌 a β†’ 𝐌 a β†’ 𝐌 a 
maybe2 _    𝑁     x  = x 
maybe2 _    x     𝑁  = x 
maybe2 f (𝐽 a) (𝐽 b) = 𝐽 (f a b) 
 
 
 
-- == Un programa que solicita y muestra =========== 
runStatisticsApp st = do 
    values ← putStr "Values (e.g. '1 2 3 4'): " » (map read ∘ words) β†₯ getLine 
    β†°_(computeStatistics st values) $ Ξ»(St s) β†’ 
        putStrLn $ getName s β§Ί ": " β§Ί show (getValue s) 
 
main = runStatisticsApp [ St $ StMin 𝑁 
                        , St $ StMax 𝑁 
                        , St $ StAvg 𝑁 
                        , St $ StDev 𝑁 
 
{- 
 
> main 
Values (e.g. '1 2 3 4'): 4 3 1 2 
Minimum: Just 1.0 
Maximum: Just 4.0 
Average: Just 2.5 
Deviation: Just 1.118033988749895 
 
-} 

Comenta la soluciΓ³n

Tienes que identificarte para poder publicar tu comentario.