Está en la página 1de 6

Practica No.

4
Nombre: Funciones de orden superior y operadores
Nombre Alumno: Missael Hernandez Rosado.
Objetivo: Utilizar Haskell para resolver problemas por computadora,
utilizando caractersticas vistas en clase.
Introduccin:
La programacin funcional se basa en funciones del tipo matemtico, en esta
prctica se pretende hacer uso de un lenguaje de programacin funcional puro
como Haskell para utilizar la programacin declarativa.
Materiales y equipos:
1.- Equipo de cmputo con Windows XP
2.- WinGHCi 7.6.3
Metodologa
I.- Revisa el archivo practica4.hs que se proporciona y ve resolviendo las
funciones que se indican a continuacin.
1.- Elaborar funcin que dado un entero obtener una lista con los dgitos
separados (toDigits) utilizar una expresin lamda.
toDigits 98377282

[9,8,3,7,7,2,8,2]

--1)
toDigits::Integer -> [Integer]
toDigits=undefined
uno toDigits|toDigits==0=[]
|toDigits<10=toDigits:[]
|otherwise=(uno(div toDigits 10)++(mod toDigits 10):[])

2.- Elaborar funcin que dado un entero obtener la lista con los dgitos
separados de forma inversa (toDigitsRev)
toDigitsRev 89399203

[3,0,2,9,9,3,9,8]

--2)
toDigitsRev :: Integer -> [Integer]
toDigitsRev = undefined
--dos=(\uno->reverse (uno))
dos toDigitsRev|toDigitsRev==0=[]
|toDigitsRev<10=toDigitsRev:[]
|otherwise=reverse(uno(div toDigitsRev 10)++(mod
toDigitsRev 10):[])

3.- Elaborar funcin que dada una lista de dgitos obtener una lista donde los
dgitos en posicin pares regresen en valor doble. (doubleSecond).
doubleSecond [3,4,5,2,3,4]

[3,8,5,4,3,8]

doubleSecond :: [Integer] -> [Integer]


doubleSecond=undefined
tres doubleSecond=fun doubleSecond 0
where
fun=(\l c->if(c==((length l)-1))
then(if(even(c+1))then[l!!c*2]else[l!!c])
else(if (even(c+1))then [l!!c*2]++(fun
l(c+1))else[l!!c]++(fun l(c+1))))

4.- Elaborar funcin que dada una lista de nmeros obtenga la suma de los
dgitos (sumDigits)
sumDigits [4,8,5,10,2,18,3]

(4+8+5+(1+0)+2+(1+8)+3)

32

--4)
sumDigits :: [Integer] -> Integer
sumDigits = undefined
cuatro=(\sumDigits->sum(map (suma)sumDigits))
where
suma a|a==0=0
|otherwise=(mod a 10)+(suma(div a 10))
5.- Elaborar una funcin (isValid) que se le pase un entero >0 y valide un
nmero de tarjeta de crdito utilizando el algoritmo de suma de comprobacin
que consiste en lo siguiente:
- Obtener el doble de cada digito segundo iniciando a la derecha.
- Sumar los dgitos de todos los dgitos incluyendo los dobles
calculados.
- Calcular el mdulo 10 de la suma que debe dar 0.
isValid 4012888888881881
[1,8,8,1,8,8,8,8,8,8,8,8,2,1,0,4]
[1,16,8,2,8,16,8,16,8,16,8,16,2,2,0,8]
1+(1+6)+8+2+8+(1+6)+8+(1+6)+8+(1+6)+8+(1+6)+2+2+0+8]
90
0

True
NOTA: Hagan uso de las funciones anteriores.
--5)
isValid :: Integer -> Bool
isValid = undefined
cinco=
(\isValid->(mod(cuatro(tres(dos
isValid)))10)==0)

6.- Elabore una funcin que de una lista de tarjetas de crdito indique cuantas
son vlidas. Utilice la funcin de orden superior filter
filter es una funcin en haskell de orden superior que tiene el siguiente
formato:

filter :: (a -> Bool) -> [a] -> [a]


(a->Bool): Funcin que recibe valor de tipo a
y retorna booleano.
[a]: Lista de tipo a (in)
[a]: Lista de tipo a (out)
Recibe una funcin que se aplica a cada elemento de una lista, la funcin
retorna True o False segn el valor de cada a y retorna una lista de todos los
elementos de la lista que cumplen True para la funcin.
Probar
numValid creditcards
--6)
numValid :: [Integer] -> Integer
numValid xs = undefined
seis numValid=fromIntegral(length(filter(cinco)numValid))
Recomendaciones
Intenta resolver todos los problemas antes de utilizar el ambiente de Haskell
para que revises que tanto te han quedado claros los conceptos vistos en la
clase.

Observaciones

Cuestionario

Fuentes de informacin:
En este apartado pondrs referencias que hayas utilizado extra para
documentar el reporte de la prctica.
Conclusiones y reflexiones personales:
Me doy cuenta que tengo problemas con las notacion lambda, a la vez note
diferencia a la hora de resolver los problemas ya que no se me hizo tan
complicado como al inicio del curso, quizas solo es cuestion de practica en mi
caso. La practica en si me ayudo a darme cuenta la facilida que tiene el
lenguaje de Haskell para resolver problemas de esa pequea o gran magnitude
que en otro lenguaje hubiera costado mas tiempo y sintaxis.

También podría gustarte