Vielleicht analog Sie Argumentation, zu denken, dass „unbestimmt“ ist das Haskell Äquivalent eines void-Zeiger oder NULL-Verweis in einer OO-Sprache. Es ist nicht. In Haskell ist ein undefinierter Wert einfach ein Fehler, der darauf wartet, zu passieren.
Wenn Sie einen optionalen Wert wünschen (die Art von Dingen, für die Sie in anderen Sprachen eine Nullreferenz verwenden würden), dann möchten Sie vielleicht. So ist zum Beispiel ein Maybe Int entweder "Nothing" oder "Just 5".So hat zum Beispiel die „Lookup“ -Funktion
lookup :: Eq a => a -> [(a, b)] -> Maybe b
geben Dieses sagt, dass es die Dinge in einer Liste von Paaren schaut auf das Schlüsselelement durch Anpassung (Typ „a“) und gibt dann das zweite Element in dem Paar (Geben Sie "b" ein). Natürlich kann es den Schlüssel nicht finden, in diesem Fall gibt es "Nichts" zurück.
lookup "foo" [("foo", 1), ("bar, 2)] gives Just 1
lookup "wib" [("foo", 1), ("bar, 2)] gives Nothing
Um das Ergebnis aus dem bekommen Sie verwenden Pattern-Matching "Vielleicht":
case lookup myKey theTable of
Just result -> putStrLn $ "Found " ++ show result
Nothing -> putStrLn "Key not found"
Sie können auch die Verwendung "vielleicht" und "fromMaybe" Funktionen in Data.Maybe. Wenn Sie absolut sicher sind, dass der Wert wirklich da ist, können Sie auch "fromJust" verwenden, aber Sie müssen sehr sicher sein, und selbst dann sollten Sie eine explizite Argument für Nothing haben, so dass Sie eine sinnvolle Fehlermeldung geben können, wenn Sie entpuppen sich als falsch.
Edit: Erklärung, warum wir es tun diese Weise
Der Grund, dass Haskell nicht null Referenzen hat wie andere Sprachen ist, dass sie von Natur aus mehrdeutig sind. Wenn irgendein Wert "Null" sein kann, können Sie nicht sicher sein, ob Sie nach Null suchen sollten oder nicht. Im obigen "Lookup" -Beispiel macht es also den Rückgabetyp "Maybe b" eindeutig, und außerdem, wenn Sie vergessen zu checken, dann sagt Ihnen der Compiler. Wenn "Lookup" hingegen einen Verweis zurückgibt, der null sein könnte, wie soll der Aufrufer das wissen? Was passiert, wenn eines der Argumente für "Lookup" ebenfalls null ist? Wäre das ein Fehler? Wenn Sie NULL-Referenzen haben, können Sie den Code nur lesen oder hoffen, dass er in die Dokumentation aufgenommen wurde.
Nicht definiert ist ein bisschen wie ein Fehlerwert. Wenn Sie es auswerten, wird ein Fehler ausgegeben. Es ist * kein * Datenwert. – AJFarmar
Haskell erlaubt keinen Nullzeiger/Nullwert: Er wurde entworfen, um einen [Milliarden Dollar Fehler] (https://en.wikipedia.org/wiki/Null_pointer#History) zu vermeiden. – chi