UTNianos

Versión completa: Ayuda con funcion filter de Haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Cita:En una aplicación que se conecta a Twitter, trabajamos con Tweets, de los que conocemos el usuario que lo escribió, y el contenido del tweet (el texto que escribió).

Es decir, tenemos, por ejemplo

tweet = ("pablo","estoEsUnTweet")

Me piden

Cita:Dado un conjunto de tweets y un usuario, obtener las primeras 10 letras del contenido de los tweets que pertenecen a ese usuario.

Ejemplo:

>>obtener [("pablo","estoEsUnTweet"),("pepe","blaBlaBla"),("pablo","argentinaVencioABrasil"),("pablo","otroEjemploMas"),("carlos","etcEtcEtc")] pablo
["estoEsUnTw","argentinaV","otroEjempl"]

Yo pense en hacer algo como esto:



--type

type Usuario = String
type Contenido = String
type Tweet = (Usuario, Contenido)


esDelUsuario :: Usuario -> Tweet -> Bool
esDelUsuario usuario (usuarioTweet,_) = usuarioTweet == usuario

obtener :: [Tweet] -> Usuario -> [Contenido]
obtener tweets usuario = filter esDelUsuario usuario tweets



Mi problema es que filter es (a -> Bool) -> [a] -> [a]
Y mi funcion esDelUsuario es a -> b -> Bool (porque necesito pasarle el usuario para que vea con cual comparar los usuarios de los tweets)

Alguna idea?
Mira haciendo esto te va a funcionar, aclaro que es una variacion del punto 2 del TP de Twitts que tengo que hacer para mañana, fijate:


hombretwitteo tweets nombre = fst(tweets) == nombre
tweetsdeusuario tweetts nombre = [take 10 (snd (twet)) | twet<-tweetts, hombretwitteo twet nombre]



Es la funcion filter pero hecha por mi, sin invocar el filter porque nunca supe como se hacia bien.

tweetsdeusuario[("pablo","estoEsUnTweet"),("pepe","blaBlaBla"),("pablo","argentinaVencioABrasil"),("pablo","otroEjemploMas"),("carlos","etcEtcEtc")] "pablo"
["estoEsUnTw","argentinaV","otroEjempl"]

:B
Haciendolo como lo estas haciendo lo único que tendrías que cambiar es

obtener listaDeTweets usuario = filter (esDelUsuario usuario) listaDeTweets

y fijate que para que funcione cuando le mandas lo que tenes en el ejemplo el ultimo pablo tiene que ir entre ""
TIGRE TE PASO 3 FORMAS DE HACERLO, HOY VINE DE BUEN HUMOR Y VI TU PEDIDO, ESPERO TE SIRVA. LO QUE NO ENTIENDAS PREGUNTAME POR FACE SI QUERES
NO ME CONECTO TAN SEGUIDO PARA VER UN TEMA POR ACA , ABRAZOOO

listaTweets = [("pablo","estoEsUnTweet"),("pepe","blaBlaBla"),("pablo","argentinaVencioABrasil"),("pablo","otroEjemploMas"),("carlos","etcEtcEtc")]

***************************************************************************************
1) obtener unaLista unUsuario = map (take 10) [tweet|(usuario,tweet) <- unaLista, usuario == unUsuario]
***************************************************************************************
2) obtener unaLista unUsuario = (map(take 10).map snd)(filter(\(usuario,_) -> usuario == unUsuario)unaLista)
***************************************************************************************
3) obtener unaLista unUsuario = (map(take 10).map snd)(obtenerTuplas unUsuario unaLista)
obtenerTuplas unUsuario unaLista = filter((==unUsuario).fst)unaLista
***************************************************************************************
Barbaro! Me viene joya para la opcion en donde hay que usar listas por comprension.

Edit: Gracias a los dos! Ahi lo entendi bien!
Hola santi se me ocurrio que:

obtener lista persona = [take 10 tweet|(usuario,tweet)<-lista,persona==usuario]

No te podes quejar, eh =P
(25-04-2013 00:08)CarooLina escribió: [ -> ]Hola santi se me ocurrio que:

obtener lista persona = [take 10 tweet|(usuario,tweet)<-lista,persona==usuario]


Off-topic:
santi??? jaja


Si, es parecido a lo que puso Maartin


(24-04-2013 23:59)Alexismp escribió: [ -> ]Haciendolo como lo estas haciendo lo único que tendrías que cambiar es

obtener listaDeTweets usuario = filter (esDelUsuario usuario) listaDeTweets

No me funciona asi, justamente es lo que estaba probando.

Edit: Sacandole el tipo a la funcion, me anduvo, voy a mirar que carajo puse mal =P
Que se yo, cuando entre nadie había puesto nada! Si pero la mia es mas clara y simple =)

Bueno por que dice sentey es que me olvido que te llaams franco
Ahi me salio, era un problema con los tipos que tenia, porque estaba haciendo la funcion sin terminar (todavia no tomaba los primeros 10 caracteres) y ya habia puesto el tipo de la funcion.
Gracias a todos!

Dejo el codigo que me quedo (aunque posiblemente lo optimice despues, ahora tengo sueño =P)

Cita:Dado un conjunto de tweets y un usuario, obtener las primeras 10 letras del contenido de los tweets que pertenecen a ese usuario. Hacerlo dos veces: primero empleando orden superior y luego empleando listas por comprensión



--type

type Usuario = String
type Contenido = String
type Tweet = (Usuario, Contenido)


esDelUsuario :: Usuario -> Tweet -> Bool
esDelUsuario usuario (usuarioTweet, _) = usuarioTweet == usuario

obtener :: [Tweet] -> Usuario -> [Contenido]
obtener tweets usuario = (map (take 10).map snd) (filter (esDelUsuario usuario) tweets)

obtener2:: [Tweet] -> Usuario -> [Contenido]
obtener2 tweets usuario = [take 10 tweet | (usuarioTweet,tweet) <- tweets, usuarioTweet == usuario]


--Main> obtener[("pablo","estoEsUnTweet"),("pepe","blaBlaBla"),("pablo","argentinaVencioABrasil"),("pablo","otroEjemploMas"),("carlos","etcEtcEtc")] "pablo"
--["estoEsUnTw","argentinaV","otroEjempl"]

--Main> obtener2[("pablo","estoEsUnTweet"),("pepe","blaBlaBla"),("pablo","argentinaVencioABrasil"),("pablo","otroEjemploMas"),("carlos","etcEtcEtc")] "pablo"
--["estoEsUnTw","argentinaV","otroEjempl"]



Spoiler: Mostrar


#include <stdio.h>

int main(void){
while (1)
printf("EEEEEEH\n");
return 0;
}



obtener tweets usuario = [take 10 tweet | (usuarioTweet,tweet) <- tweets, usuarioTweet == usuario]


que lindo que es haskell
URLs de referencia