UTNianos

Versión completa: Pregunta Paradigma Funcional
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Alguno podrá ayudarme con este punto le agradecería:

*Definir la función esMultiploDeAlguno, que recibe un número y una lista y devuelve True si el número es múltiplo de algunos de los números de la lista.
Main> esMultiploDeAlguno 15 [2,3,4]
True

Yo propuse:
esMultiploDeAlguno nro lista = any (funcion) lista
funcion nro lista | mod nro lista ==0 = True
| otherwise = False

... pero no funca...
tenes que separa la lista en cabeza y cola

comparas el numero con la cabeza y llamas de nuevo a la funcion con el numero y el resto de la lista
y como se hace correctamente? (aclaracion: no entiendo casi nada de esto jaja)

yo puse:
esMultiploDeAlguno nro lista = any (funcion) lista
funcion nro (cab:cola) | mod nro cab ==0 = funcion nro cola
| otherwise = False

gracias!
Nunca me gusto funcional.... bah, nunca me gusto paradigmas.

Mucho no me acuerdo, pero proba esto:

esMultiplo num list = filter (funcion num) list

funcion num elemLista = mod num elemLista ==0



filter le aplica la funcion a cada elemento de la lista
Estas mezclando recursividad con orden superior.

Con recursividad se resolvería de esta forma:

esMultiploDeAlguno nro (cab:cola) = esMultiplo nro cab || esMultiploDeAlguno nro cola
esMultiploDeAlguno _ [] = False

esMultiplo nro x = mod nro x == 0


Ademas te faltaba el caso base.

Sin recursividad sería:


esMultiploDeAlguno nro lista = any (esMultipo nro) lista


(13-05-2012 22:09)el pibe escribió: [ -> ]Nunca me gusto funcional.... bah, nunca me gusto paradigmas.

Mucho no me acuerdo, pero proba esto:

esMultiplo num list = filter (funcion num) list

funcion num elemLista = mod num elemLista ==0



filter le aplica la funcion a cada elemento de la lista

Nono, filter no, filter es para filitrar una lista, y te crea una nueva de acuerdo al criterio que le pasas.
(13-05-2012 22:16)shecoop escribió: [ -> ]
(13-05-2012 22:09)el pibe escribió: [ -> ]Nunca me gusto funcional.... bah, nunca me gusto paradigmas.

Mucho no me acuerdo, pero proba esto:

esMultiplo num list = filter (funcion num) list

funcion num elemLista = mod num elemLista ==0



filter le aplica la funcion a cada elemento de la lista

Nono, filter no, filter es para filitrar una lista, y te crea una nueva de acuerdo al criterio que le pasas.

Por eso, me falto decir que te devuelve otra lista, filtrada (es decir, aplicandole la funcion a cada elemento).

De todas formas, funca con el filter ?
pero quiere saber si al menos uno es multiplo de la lista

para mi recursividad va


sino el any tambien que le pasas una funcion y te dice si algun elemento la cumple, pasandole una lista

pero no hay que aplicar recursividad y el any ehh


suponiendo que lo que recuerde de funcional sea correcto =P
ah ahi vi que ya pusieron la posibilidad con el any blush
Los chicos de paradigmas te dirian que es mas feliz que lo hagas con el any que con recursividad

digamos que solo debe usarse como ultima instancia (?)
No filter no sirve porque vos lo que queres es que te devuelva True o False, y eso es lo que hace el any. El filter te devuelve una nueva lista. En todo caso podrias preguntar si esa lista filtrada tiene algun elemento (length > 1) Pero ya es muy algoritmico, teniendo la posibilidad de usar any.
ah, lei mal el enunciado =P

Pense que decia informar cuales eran multiplos


sinRepetidos [] = []
sinRepetidos (x:xs) | elem x xs = sinRepetidos xs
| otherwise = x : sinRepetidos xs


URLs de referencia