2011-12-19 11 views
15

A chi piace dirmi cosa c'è di sbagliato in questo codice (sintatticamente)?Haskell: errore di errore nel pattern

-- 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 

Interprete:

errore Parse nel modello: mergeX

risposta

30

avete bisogno di qualche parentesi:

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) 

Il motivo è dovuto al fatto : ha una precedenza inferiore rispetto funzione applicazione, quindi sarà mergeX a:as b:bs res analizzato come:

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

che è un errore.

+0

Grazie, mi ricordo che avevo sth. così prima;). Normalmente usi (x: xs) invece di x: xs per evitare errori? – user905686

+1

@ user905686: In uno schema, sì. – kennytm

1

È necessario inserire schemi di costruzione (o comunque sono chiamati) in paraste.

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