2011-02-06 12 views
20

Stavo facendo il 99 Problems in Haskell quando ho incontrato un solution a Problem 19 che non ho capito completamente.Haskell (n + 1) nel modello corrispondente

Il compito è quello di scrivere una funzione di rotazione che funziona in questo modo

*Main> rotate ['a','b','c','d','e','f','g','h'] 3 
"defghabc" 

*Main> rotate ['a','b','c','d','e','f','g','h'] (-2) 
"ghabcdef" 

Una soluzione prevista è

rotate [] _ = [] 
rotate l 0 = l 
rotate (x:xs) (n+1) = rotate (xs ++ [x]) n 
rotate l n = rotate l (length l + n) 

Non capisco come il pattern matching potrà mai raggiungere la quarta linea. Sembra che abbia a che fare con lo (n+1) in modo che quando n è negativo, la terza riga non corrisponde e quindi viene presa la quarta. Se questo è il motivo per cui la notazione (n+1) funziona in questo modo resp. non è arbitrario o è una convenzione (in matematica?) di cui non sono a conoscenza?

Perché il modo in cui ho capito è che la rotazione viene chiamata ricorsivamente nella terza riga con l'argomento n ridotto di uno. Così penserei che

rotate [] _ = [] 
rotate l 0 = l 
rotate (x:xs) n = rotate (xs ++ [x]) (n-1) 
rotate l n = rotate l (length l + n) 

è equivalente. Tuttavia, non lo è. Questa definizione fornisce la seguente avvertenza

Warning: Pattern match(es) are overlapped 
     In the definition of `rotate': rotate l n = ... 

considerando che la precedente definizione viene compilata correttamente.

risposta

26

È un caso specifico di ciò che viene chiamato "n + k patterns", che generalmente non è gradito, e will be has been removed from the language. Vedere here per ulteriori informazioni.

Here è una buona nota sui modelli di n + k, che cita quanto segue dal 98 Rapporto Haskell (sottolineatura mia):

corrispondenza uno schema n + k (dove n è un k variabile e è un intero positivo letterale) rispetto a un valore v ha esito positivo se x> = k, con conseguente associazione di n a x - k e non riesce altrimenti. Anche in questo caso, le funzioni> = e - sono sovraccaricate, a seconda del tipo di motivo. La partita diverge se il confronto diverge.

L'interpretazione dei k letterale è gli stessi numerici letterali modelli, eccetto che solo interi sono consentiti letterali.

Così il n+1 è pari solo se n è almeno 1, come si sospetta. Il tuo codice alternativo rimuove questa restrizione, risultando in corrispondenze di pattern sovrapposte.

+0

"È un caso specifico di ciò che viene chiamato" n + k patterns ", che in genere non piace". Penso che la soluzione migliore avrebbe potuto introdurre un tipo per i numeri naturali, che può essere usato per esprimere * size * e definire il modello * n + 1 * sui naturali. Mancando questo tipo in Haskell e nella maggior parte dei linguaggi, come C/C++, vediamo la pena di definire 'unsigned int',' size_t' (che è veramente naturale sotto il cofano) e problemi associati di confronto tra il tipo firmato e unsigne ecc. Con i naturali, possiamo fare analisi del caso sulla dimensione delle strutture, che è abbastanza fondamentale e facile in Haskell. – tinlyx

Problemi correlati