UTNianos

Versión completa: consulta haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
--tp N1 Bar funcional

type Nombre = String
type Agregado = String
type Sabor = String
type Azucar = Integer
type Sabores = (String,String)
type Salsa = String

data Promo = Cafe Nombre Azucar | Gaseosa Sabor Azucar |
Helado Sabores Salsa | AguaMineral deriving Show

esRecomendable promo

|calorias promo < 100 && nombre=="Capuchino"= True
|otherwise=False


ERROR:
Prelude> :reload
Ok, modules loaded: none.
Prelude> esRecomendable (Cafe "Capuchino" 30)

<interactive>:11:1: Not in scope: `esRecomendable'

<interactive>:11:17: Not in scope: data constructor `Cafe'
gtotaro
La pregunta es por que te tira eso ?
Tenes, por un lado, error en la indentacion, en haskell trata siempre de hacerlo con espacios (no tabulaciones), y que queden los "palitos" bien alineados, así:



funcion argumento | argumento == 2 = True
| otherwise = False



Por otro lado, tenes varios errores...no está definida la función calorías, y la variable nombre tampoco


Off-topic:
Trata de poner "hola", y describir tu problema un poco, aunque sea, vas a encontrar mejor respuesta acá =)
te paso como lo defini:
calorias (Cafe nombre azucar) = 3*azucar
calorias (Gaseosa sabor azucar) = azucar
calorias (Helado sabores salsa) | sabores==("cereza","chocolate") && salsa == "chocolate" = 370
| sabores==("chocolate","cereza") && salsa == "chocolate" = 370
| otherwise = 220
calorias (AguaMineral) = 0
Fijate de indentar bien y de definir todas las funciones necesarias.
Este código debería funcionar, probalo.



type Nombre = String
type Agregado = String
type Sabor = String
type Azucar = Integer
type Sabores = (String,String)
type Salsa = String

data Promo = Cafe Nombre Azucar | Gaseosa Sabor Azucar | Helado Sabores Salsa | AguaMineral deriving Show

esRecomendable promo |calorias promo < 100 && nombre promo =="Capuchino"= True
|otherwise=False



calorias (Cafe nombre azucar) = 3*azucar
calorias (Gaseosa sabor azucar) = azucar
calorias (Helado sabores salsa) | sabores==("cereza","chocolate") && salsa == "chocolate" = 370
| sabores==("chocolate","cereza") && salsa == "chocolate" = 370
| otherwise = 220
calorias (AguaMineral) = 0

nombre (Cafe nombre _) = nombre


Finalmente, lo deje así para tome cualquier gusto..
calorias (Cafe _ azucar) = 3*azucar
calorias (Gaseosa sabor azucar) = azucar
calorias (Helado (sabor1,sabor2) salsa) | salsa == "chocolate" && sabor1=="chocolate" || sabor2=="chocolate" = 370
| otherwise = 220
calorias (AguaMineral) = 0

Gracias x la ayuda.
Continuo con el 4)
cualquier cosa,sino te molesta te pregunto...
OJO:

(16-04-2014 16:48)sentey escribió: [ -> ]Tenes, por un lado, error en la indentacion, en haskell trata siempre de hacerlo con espacios (no tabulaciones)
Esto no es cierto. El los tabs funcionan perfecto, de hecho con tabs queda mucho mas prolijo.

(16-04-2014 16:48)sentey escribió: [ -> ], y que queden los "palitos" bien alineados, así:



funcion argumento | argumento == 2 = True
| otherwise = False


Esto es cierto. Otra forma de hacerlo es


funcion argumento
| argumento == 2 = "esDos"
| otherwise = "noEsDos"


[/quote]


Y ojo, porque en la definición de la función que estás haciendo


calorias (Cafe nombre azucar) = 3*azucar
calorias (Gaseosa sabor azucar) = azucar
calorias (Helado sabores salsa) | sabores==("cereza","chocolate") && salsa == "chocolate" = 370
| sabores==("chocolate","cereza") && salsa == "chocolate" = 370
| otherwise = 220


te falta una abstracción. Fijate en todos esos ' == "chocolate" ' ... no te suena a que lo pusiste muchas veces? qué representa que algo de todo eso sea chocolate?
URLs de referencia