UTNianos

Versión completa: Ayuda con Pattern matching en Haskell
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, estoy tratando de hacer la guia 3 de ejercicios, y en varios tengo errores de este tipo . Por ejemplo en este :

1.9. Definir la función diferencias/1 recursivamente, que recibe una lista de números devuelve la
diferencia, en valor absoluto, de cada uno con el siguiente, excepto el último que no tiene
siguiente. P.ej. se espera que

Main> diferencias [5,8,3,1,9]
[3,5,2,8].



Yo la arme asi:
diferencias [] = []
diferencias (x:y:xs) = (y - x) : diferencias (y:xs)


y me tira el error

Main> diferencias [10,6,12]
[-4,6
Program error: pattern match failure: diferencias [12]


No se como arreglar ni como hacer que de siempre positivo, alguna ayuda ?

Gracias =D
hace 3 años que no toco haskell =P

pero estas definiendo "definicion" (valga la redundancia) de 2 maneras

una para la vacia


definicion []


y la otra para primer y segundo elemento y la lista


definicion(x:y:xs)

(recibe un elemento [el primero], otro [el segundo], y una lista [el resto]

sin embargo, al usarla recursivamente, estas usando otro pattern


definicion(x:y)

ahi no estas mandando la lista, y no va a hacer pattern matching!
ese es el error

para que siempre te de positivo, usa la funcion "abs"


abs



main = print (abs (3 - 5))

cuando se trabaja con listas no es importante cuantos parametros mandas, siempre y cuando respetes la lista vacia y la cola (si dice (x:y:xs) y le mandas (x:xs) donde xs tiene al menos un elemento te lo deberia tomar).

El problema en tu codigo es que parece que hiciste "de memoria" el valor inicial para la recursividad, que generalmente es la lista vacia, pero en este caso seria el ultimo valor de la lista (o sea cuando le llega un solo elemento), porque con ese no tiene nada para hacer, ya termino de recorrerla, y haskell trata de hacer [] - x.
El programa se corrigiria haciendo diferencias [y] = [].

Espero que te sirva!

Saludos!

PD: el valor absoluto se toma con la funcion abs x.
Gracias, ya lo pude arreglar thumbup3
URLs de referencia