UTNianos

Versión completa: [Paradigmas] Duda con Haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Tengo este ejercicio :
tengo clientes, nombre del cliente y la plata que tienen
-- clt = (nombre, plata)
clientes = [("pepito", 50),("roberto",20),("dora",30)] -- lista de clt
plataClientes(_,plata) = plata
plataTotal clientes = sum [ plataClientes uncliente | uncliente <- clientes ]

aca tengo articulos, nombre y precio, y una funcion que devuelve la plata que tienen los clientes, despues de comprar un articulo.
-- articulo= (nombre, precio)
articulo = ("cuchillo", 15)
devolverPrecio (_,precio) = precio
cobroArticulo clt articulo = plataClientes clt - devolverPrecio articulo

ahora quiero una funcion en la que le paso los clientes (clientes) y no se si corresponderia o no, pasarle el artículo, y que me devuelva una lista, con los nombres y la plata actual, despues de comprar un artículo, siempre y cuando la plata actual de los clientes sea mayor 10.
Sería algo así, pero esto está mal:
listaPlatudos clientes = [ uncliente | uncliente <- clientes, cobroArticulo uncliente articulo > 10 ]

la pregunta es: cómo lo debería escribir¡???
saludos!
La verdad se me complicó pensarla.... Con un filter y adentro un map no se puede? con el map restás el monto del artículo y después con el filter filtrás los mayores a diez????

Puede que esté mandando mucha fruta...
Claro, vos querés tipo pasar un valor numérico y después que se ejecute la función y la salida sea una lista?
El otro dia tuvimos esa idea, si es eso lo que necesitás hacer, me fijo en lo que tengo hecho. Igual tengo mis dudas, voy dos clases de la materia
no faltan datos ?
como se que productos compran cada clientes ? o todos compran el mismo producto ?
desp de saber eso, si, con un map y filter deberia andar joya
cualquier idea es bienvenida, estoy probando a lo pavote...
aye, lo que decís de filter y map, no tengo ni idea, si podes explicame, o pasame algo de donde pueda leerlo, se agradece.
con "n o tengo ni idea" te referis a que no lo viste todavia en la cursada ? xD
gonnza, suponé que todos compran el mismo producto (articulo= ("cuchillo",15) . y no, no lo vi en la cursada, pero estoy en un curso que medio te tiran los temas y arreglate, y acá estamos, haciendo sombras chinescas.
De seguro que si te dieron ese ejercicio y todavía no te explicaron estas funciones es porque deberíamos pensarlo de otra manera.... De todos modos te comento:

map transforma una lista en otra aplicando una función a todos sus elementos.. POR EJEMPLO podríamos tener una función que sea +2 y una lista que sea [1..5], si hacemos map (+2) [1..5] lo que vamos a tener como resultado es [3, 4, 5, 6, 7]. Con esta misma lógica vos en vez de un (+2) podrías generar una función que te devuelva una tupla de persona, pero con el importe restado... algo así como leRestoElImporteA miCliente miImporte y ahí adentro hacer el cálculo....

El filter te devuelve como resultado una nueva lista que está filtrada por una función... POR EJEMPLO si querés saber qué valores son mayores a 5 en la lista[3..8], podés hacer un:
filter (>5) [3..8]
De esa manera, tu resultado será otra lista con los valores [6,7,8]... Con este filter lo que podés hacer es acotar a todos los clientes que después de haberle restado el importe del producto (es decir, después de haber hecho el map), su importe sea mayor a 10....

Sintácticamente se me complica porque no tengo hugs instalado y no quiero mandar fruta.... Si te dijeron que lo hagas y no te comentaron de estas funciones es porque definitivamente podrías hacerlo por otro medio... Si es así avisame y la pensamos de nuevo =)

Por último, te dejo un documento en el cual se explica un poco mejor estas funciones (llamadas, Funciones de Orden Superior): LINK AL DOCUMENTO

Espero que se haya entendido, cualquier cosa me consultás!!!
si todos compran el mismo articulo, tonces tenes que hacer que el cliente compre el articulo, y tras ello ver que su plata sea 10

entonces

listaPlatudos clientes = [(cliente, cobroarticulo un cliente articulo) | (cliente, plata)<- ((plataclientes cliente) - (clientes, cobroarticulo uncliente articulo)) >10]

ya que con la funcion solo te devuelve cuanta plata le quedaria si compras, podes con eso ver si le queda mas de 10 tras comprar, y como no actualiza la lista al comprrar, la liusta que devuelva tiene que tener la plata restada de lo que compraste, asique especificas la tupla y pones la plata que le quedaria (que es la que le devuelve la funcion)
Modifiqué esta linea asi:


cobroArticulo plat articulo = plat - devolverPrecio articulo



y después agregué esto:


clienteActualizado (nombre,plata) = (nombre,cobroArticulo plata articulo)
plata = snd
listaPlatudos clientes = [ clienteActualizado uncliente | uncliente <- clientes , plata (clienteActualizado uncliente) > 10 ]



Y listaPlatudos clientes te devuelve


[("pepito",35),("dora",15)]



thumbup3
Muchísimas gracias por las respuestas.. el problema principal que tenía, era una opción marcada por defecto en el WinHugs...que me tiraba error a cada rato..
URLs de referencia