2011-12-19 17 views
15

¿A quién le gusta decirme qué está mal con este código (sintácticamente)?Haskell: Error de análisis en el patrón

-- merge two sorted lists 
mergeX [] b res = b ++ res 
mergeX a [] res = a ++ res 
mergeX a:as b:bs res 
    | a > b  = mergeX as b:bs a:res 
    | otherwise = mergeX a:as bs b:res 

Intérprete:

Error de análisis de patrón: mergeX

Respuesta

30

usted necesita algunas paréntesis:

mergeX [] b res = b ++ res 
mergeX a [] res = a ++ res 
mergeX (a:as) (b:bs) res 
    | a > b  = mergeX as (b:bs) (a:res) 
    | otherwise = mergeX (a:as) bs (b:res) 

La razón es porque : tiene una precedencia más baja que la función aplicación, por lo que mergeX a:as b:bs res será analizado como:

(mergeX a):(as b):(bs res) 

que es un error.

+0

Gracias, recuerdo que tuve algo. así antes;). ¿Normalmente siempre usa (x: xs) en lugar de x: xs para evitar errores? – user905686

+1

@ user905686: en un patrón, sí. – kennytm

1

Necesita poner patrones de constructor (o como se llamen) en parantheses.

mergeX (a:as) (b:bs) res