Perché trovo la domanda interessante, ho deciso di scrivere i miei pensieri sul tema:
Logical
dire che definiamo init xs
come "la lista, che, se si mette last xs
sul suo end, è uguale a xs. Questo è equivalente a: init xs
è l'elenco senza il suo ultimo elemento. Per xs == []
, non esiste alcun ultimo elemento, pertanto init []
deve essere indefinito.
Si potrebbe aggiungere un caso speciale per questo, come in "se xs è la lista vuota, quindi init xs
è la lista vuota, altrimenti init xs
è la lista, che, se si mette last xs
sulla sua fine, è pari a xs ". Nota come questo è molto più prolisso e meno pulito. Introduciamo ulteriore complessità, ma per cosa?
intuitiva
init [1,2,3,4] == [1,2,3]
init [1,2,3] == [1,2]
init [1,2] == [1]
init [1] == []
init [] == ??
Si noti come la lunghezza delle liste sul lato destro delle equazioni diminuisce insieme alla lunghezza del lato sinistro. Per me, questa serie non può essere proseguita in modo ragionevole, perché l'elenco sul lato destro dovrebbe avere una dimensione negativa!
pratiche
Come altri hanno sottolineato, definente un trattamento per init
o tail
per la lista vuota come argomento caso particolare, può introdurre errori difficili da luogo a situazioni in cui funzioni possono avere alcuna ragionevole risultato per la lista vuota, ma ancora non produce un'eccezione!
Inoltre, non riesco a pensare ad alcun algoritmo in cui sarebbe effettivamente vantaggioso avere init []
valutare su []
, quindi perché introdurre questa complessità aggiuntiva? La programmazione riguarda la semplicità e soprattutto Haskell è tutto basato sulla purezza, non sei d'accordo?
init dovrebbe restituire tutto tranne l'ultimo elemento di una lista. Gli elenchi vuoti non hanno un ultimo elemento, quindi neanche init. Inoltre, l'invariante 'xs == init xs ++ [last xs]' non sarebbe più valido se init fosse definito nel modo in cui descrivi. –
@Niklas Ma, allo stesso modo si potrebbe dire, init dovrebbe restituire tutti gli elementi che non sono l'ultimo elemento, non ci sono tali elementi quindi dovremmo restituire la lista vuota. – HaskellElephant
@Niklas, non lo sarebbe ancora? Voglio dire se last [] = [] –