UTNianos

Versión completa: Duda listas de funciones en haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas gente, tengo una duda con una lista de funciones en haskell:
A mi me piden desarrollar la función atracciones que dado un parque, permite conocer el conjunto de todas las atracciones, siendo parque una lista de tuplas conformada por (tema, [funciones]), o sea, yo tengo q concatenar todos los segundos elementos de la lista de parque, mi código es:


atracciones:: Parque -> Atracciones
atracciones [] = []
atracciones (cab:cola) = snd (cab) ++ atracciones cola


Por ejemplo con parques = [("diversiones", [montanaRusa 100, caidaLibre 60]), ("temático", [mundoMaya, cine4D]) ] tendría que devolver [montañaRusa 100, caidaLibre 60 , mundoMaya, cine4D]

Pero cuando lo ejecuto, me da que no puede encontrar la show function. Si alguno me puede ayudar será bienvenido jaja
esto no te sirve?

parques = [("diversiones",[1,2]),("tematico",[3,4]),("acuatico",[5,6])]
-- puse números en la tupla porque no tengo definidas las funciones.

[] = []
atracciones xs = [snd(x)|x<-xs]

devuelve:
*Main> atracciones parques
[[1,2],[3,4],[5,6]]

edit: que es lo mismo que:
atracciones' xs = map (snd) xs

Slds,
Lo que pasa es que ahí me da una lista de listas como resultado, yo necesito una sola lista con todos los elementos, en tu caso me tendría que dar: [1,2,3,4,5,6]
Fijate si de esta forma te funciona

atracciones lista = concat [snd list | list <- lista]

Prueba:
Main > atracciones [("diversiones",["montanaRusa", "caidaLibre 60"]), ("temático", ["mundoMaya", "cine4D"])]
["montanaRusa","caidaLibre 60","mundoMaya","cine4D"]


Estan entre comillas porque no tengo dichas funciones
Armá la función concatMap, o hacelo con un fold =D
Gente, lo resolvi no se si usando alguna trampa jaja configure el winhugs para que no use show para mostrar las funciones con : S -U y me funciono perfecto. Gracias por la ayuda a todos!
No era un error, es simplemente que por defecto no te muestra las funciones (no hay show para los tipos función).

con Confused -u le sacás el show por defecto, y te muestra las funciones como strings comunes. Entonces podés ver las listas de funciones, y por lo tanto el resultado que estás esperando =)
Claro, pero nadie me había avisado de eso, y estuve un buen tiempo con ese problema wall

Ahora no se como hacer para ejecutar todas las funciones de una lista, hay una función para eso?
Buenos dias, donde pones el parametro -u?
(05-05-2013 16:20)aec escribió: [ -> ]Claro, pero nadie me había avisado de eso, y estuve un buen tiempo con ese problema wall

Ahora no se como hacer para ejecutar todas las funciones de una lista, hay una función para eso?
Tenés que aplicarlas.
Podés probar con map y una función que aplique cada función a un elemento.

(06-05-2013 11:54)Nikod11 escribió: [ -> ]Buenos dias, donde pones el parametro -u?


Main>:s -u


Si no pongo el bloque "code", me arma la carita =P
si alguno me ayuda a entender qué estoy haciendo mal, agradecido!


para:
parques = [("diversiones", [montaniaRusa 100, caidaLibre 60]), ("tematico", [mundoMaya, cine4D]) ]
donde:
montaniaRusa nro = nro
caidaLibre nro = nro
mundoMaya = 1
cine4D = 1
(como recién lo empiezo puse cualquier cosa sólo para ver este ejercicio de devolver las funciones)

me da:


Main> parques
[("diversiones",[100,60]),("tematico",[1,1])]
Main>:s -u
Main> parques
[("diversiones",[100,60]),("tematico",[1,1])]


[/code]

hay que hacer algo más además del ":s -u"?

Slds y gracias!!!
Nada, el problema que tenés es que no estás pasándole una función, sino un valor:

montaniaRusa nro = nro
caidaLibre nro = nro
mundoMaya = 1
cine4D = 1


ahí estás definiendo las funciones. Dos son constantes, luego son valores. Las otras dos las estás aplicando cuando las pasás.

Podés probar haciendo

parques = [("diversiones", [montaniaRusa , caidaLibre]), ("tematico", [(\x -> x + x ), (\x -> max 3 x)]) ]
URLs de referencia