Der sicherste Weg, diese Ausnahme zu vermeiden, ist die Verwendung von head
. Stattdessen können Sie Pattern-Matching verwenden Sie den Kopf und Schwanz einer Liste zu erhalten:
unicodeValueList (x:xs) = getLetterUnicodeValue x : unicodeValueList xs
total (x:xs) = x + total xs
Auf diese Weise x
und xs
ist nur verfügbar, wenn die Liste nicht leer ist, und es ist sichergestellt, dass Sie nicht versehentlich den Kopf zugreifen oder Schwanz einer leeren Liste.
Natürlich erhalten Sie jetzt eine Warnung, dass die Musterübereinstimmung unvollständig ist: Sie geben nicht an, was passieren soll, wenn die Liste leer ist. Natürlich war das vorher auch so, aber jetzt, da Sie den Mustervergleich verwenden, kann der Compiler das tatsächlich sehen und Sie davor warnen (während der vorherige Code zur Laufzeit ohne vorherige Warnung abgestürzt ist).
Was sollte also getan werden, wenn die Liste leer ist? Nun, eine leere Zeichenfolge enthält keine Unicode-Werte, oder? So sollte es die leere Liste zurück, wenn die Eingabe leer ist:
unicodeValueList [] = []
Natürlich kann man nicht Notwendigkeit Muster für Ihre Fehler zu beheben. Sie könnten einfach eine if
verwenden, um sicherzustellen, dass Sie nur head
und tail
aufrufen, wenn die Liste nicht leer ist. Aber wenn Sie das tun, wird der Compiler nicht in der Lage sein zu überprüfen, dass Ihre Überprüfungen in Ordnung sind. Wenn Sie Mustervergleiche verwenden und die unsicheren Funktionen head
und tail
vollständig umgehen, können Sie nie versehentlich auf den Anfang oder das Ende einer leeren Liste zugreifen, und der Compiler warnt Sie, wenn Sie vergessen, dass die Liste möglicherweise leer ist .
Ja es gibt, * und Sie haben es bereits für 'total' * getan ... – immibis