2012-09-13 13 views
9

modelli come questo:I modelli aritmetici sono legali Haskell?

front :: [a] -> a 
front (x:_) = x 
front _ = error "Empty list" 

sembrano essere comuni in Haskell, ma distintamente ricordo imparando quanto segue quando ho iniziato a imparare Haskell:

dec :: (Integral a) => a -> a 
dec (x+1) = x 
dec _ = error "Bottom" 

Tuttavia, ghc sembra respingere quel pezzo di codice , affermando:

Parse error in pattern: x + 1

Mentre hugs lo accetta bene. Quindi, questo Haskell è valido o no e perché questi compilatori si comportano diversamente.

+0

No, non è valido. –

+0

@ ДМИТРИЙМАЛИКОВ: Allora, perché gli "abbracci" lo accettano? – bitmask

+2

@bitmask Poiché hugs non ha avuto una versione dal 2006, e 'NPlusKPatterns' sono stati rimossi nello standard Haskell2010. –

risposta

16

Questo è il modello n+k. Era disliked in generale ed è stato rimosso dalla specifica Haskell2010 e GHC non lo abilita più per impostazione predefinita a differenza di Hugs che non è stato aggiornato alle specifiche più recenti. Dovrebbe essere compilato con GHCI con il flag -XNPlusKPatterns abilitato.

Vedere this per ulteriori dettagli.

9

In haskell 98 questo è legale, ma è stato bannato in haskell 2010, e questo è ciò che implementano le versioni recenti di GHC. Abbracci d'altra parte non è stato aggiornato da anni, e implementa Haskell 98.

n + k modelli sono antipatico poiché non vi può esistere numeri corrispondenti ad esempio n+1 ma non c'è n che si adatterebbe che n+1.

consideri numeri in virgola mobile: Esiste un numero che si adatta n+1 (4294967296 :: Float è la n + 1 per 4294967295, ma questo numero non può essere inserito in un Float - paragona round (4294967296 :: Float) e round (4294967295 :: Float), entrambi cedere 4294967296) .

Inoltre potrebbe essere stato rimbalzato + (haskell supporta l'overloading dell'operatore), quindi quale sarebbe la corrispondenza del modello? Al fine di evitare tali ambiguità, i pattern n + k sono stati respinti.

Se si desidera utilizzare modello k + n in ogni modo, è possibile utilizzare un linguaggio di pragma nella parte superiore del file di origine:

{-# LANGUAGE NPlusKPatterns #-} 

PS: Credo che tutto è iniziato in this email thread.