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.
"È 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