UTNianos

Versión completa: Consulta Ejercicio Haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, hice el siguiente codigo:


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

data Producto = Cafe Nombre Azucar|Gaseosa Sabor Azucar|Helado Sabores Banio|AguaMineral deriving Show

calorias :: Producto -> Integer
calorias (Cafe _ Azucar) = 3*Azucar
calorias (Gaseosa _ Azucar)= Azucar
calorias (Helado (s1,s2) Banio)|Banio == "Chocolate" && (s1=="Chocolate" || s2=="Chocolate") = 220 + 150
|otherwise = 220
calorias (AguaMineral) = 0


Me tira "not in scope data constructor 'Banio'" y "not in scope data constructor 'Azucar'"

Alguno tiene idea qué esta mal en el codigo?

Gracias =)
Las mayúsculas de Azucar y Banio. Son las variables, así que van con minúscula.
Me pasó lo mismo, también estoy luchando con los _ de este tp.
Link

Fijate en Note and Tips...igual es como dice Red16
Gracias gente, ahi me salio. el codigo quedo asi:


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

data Producto = Cafe Nombre Azucar| Gaseosa Sabor Azucar|Helado Sabores Banio|AguaMineral deriving Show

calorias :: Producto -> Integer

calorias (Cafe _ azucar) = 3*azucar
calorias (Gaseosa _ azucar)= azucar
calorias (Helado (s1,s2) banio)|banio=="chocolate" && (s1 == "chocolate" || s2=="chocolate") = 220+150
|otherwise = 220
calorias(AguaMineral)=0




Lei lo del link pero la verdad no termine de entender bien, los tipos de datos van en mayusculas, y el resto en minusculas no? por que entonces cuando defino Producto, Azucar y Banio van en mayusculas?
No te sabría decir exactamente... lo que yo entendí a partir de lo que dijo la profesora fue que al declarar va todo en mayúsculas porque estás definiendo un "tipo". Cuando vas a usar los tipos, los usás a través de variables, y esas son las que van en minúscula.
Uno define los tipos como sinónimos, tranquilamente podrías hacer todo con String e Integer, pero para ganar en expresividad se le dan nombres sinónimos.
CREO que viene por ese lado...
Si, lo pense y es por eso. Que boludo =P
Osea los tipos de datos van como mayusculas y yo use sinonimos, pero azucar, nombre sabor, banio, etc son tipos de datos!
calorias::Producto -> Integer
calorias (Cafe _ azucar) = azucar*3
calorias (Gaseosa _ azucar) = azucar
calorias (Helado ( _ ,"chocolate") "chocolate")= 370
calorias (Helado ("chocolate", _) "chocolate")= 370
calorias (Helado _ _) = 220
calorias AguaMineral= 0

contenidoCalorico::Producto -> Integer
contenidoCalorico AguaMineral = "Bajo"
contenidoCalorico | calorias Producto < 100 = " Bajo"

Como puedo hacer para reutilizar la funcion calorias en la funcion contenidoCalorico? yo lo habia pensado de esta forma pero no me funca, me tira Not in scope: data constructor `Producto'
Tenés el mismo problema, te estás confundiendo los tipos (que van con mayúsuculas) con las variables dentro de la función, que van con minúsculas.

Si estás queriendo hacer pattern matching con el constructor de tu tipo, tenés que hacer


data Tipo = Constructor Tipo1 Tipo2 Tipo3

....

funcion (Constructor variable1 variable2 variable3) = <acá usas las variables>


para usar calorías dentro de contenidoCalorico no te hace falta pattern matching, los usás polimórficamente:


contenidoCalorico unProducto
| calorias unProducto < 100 = "Bajo"
| otherwise = "Alto"


(no se las reglas que te pidieron, pero ponele)

Me hace mucho ruido el tipo AguaMineral. ¿Cómo lo definiste?
Yo hice esto y me sale este error, no cual sera la falla....

<interactive>:10:1:
The function `contenidoCalorico' is applied to three arguments,
but its type `Producto -> String' has only one
In the expression: contenidoCalorico Cafe "dsadas" 60
In an equation for `it': it = contenidoCalorico Cafe "dsadas" 60



contenidoCalorico :: Producto -> String

contenidoCalorico producto
| (calorias producto < 100) = "Bajo"
| (calorias producto < 200) = "Alto"
| otherwise = "Medio"

Me auto-corrijo....Me faltaron poner los paréntesis cuando definía el producto cry

BIEN thumbup3
ghci> contenidoCalorico (Cafe "fruta" 60)
"Alto"


PARA ATRAS thumbdown
ghci> contenidoCalorico Cafe "fruta" 60

<interactive>:11:1:
The function `contenidoCalorico' is applied to three arguments,
but its type `Producto -> String' has only one
In the expression: contenidoCalorico Cafe "fruta" 60
In an equation for `it': it = contenidoCalorico Cafe "fruta" 60
Fijate que pusiste <200 = "Alto" y deberia ser medio =P
URLs de referencia