Ich zweite die Empfehlung, die maybe
Funktion zu verwenden. Sie haben diese Frage aufgrund dieser allgemeinen Faustregel richtig gestellt (nicht nur für Sie, sondern auch für Neulinge, die es lesen): Funktionen mit direkt definierten Typen wie Maybe Foo -> Bar
oder Maybe Foo -> Maybe Bar
sind code smell in Haskell. Sie möchten fast nie eine Funktion schreiben, die Maybe Foo
als ein Argument nimmt; Sie möchten eine Funktion, die nur Foo
verwendet, und eine höherwertige Funktion verwenden, um sie an Maybe Foo
anzupassen.
Angenommen, Sie haben eine Funktion f' :: Maybe Foo -> Maybe Bar
. Dies kann in der Regel entweder in Refactoring:
f :: Foo -> Bar
und fmap f :: Maybe Foo -> Maybe Bar
;
f :: Foo -> Maybe Bar
und (>>=f) :: Maybe Foo -> Maybe Bar
Erster Fall funktioniert, weil dies die Functor
Instanz für Maybe
:
instance Functor Maybe where
fmap f Nothing = Nothing
fmap f (Just x) = Just (f x)
-- or this:
-- fmap f = maybe Nothing (Just . f)
Zweiter Fall funktioniert, weil das ist die Monad
Instanz für Maybe
:
instance Monad Maybe where
return = Just
Nothing >>= f = Nothing
(Just x) >>= f = f x
-- or this:
-- mx >>= f = maybe Nothing f mx
Das ist die erste Funktion auf dem Dokument für Data.Maybe beschrieben, und ich habe es irgendwie verpasst. Vielen Dank! – Niriel
Als Randnotiz gibt es auch die Entsprechung für "Entweder": "Entweder" in "Daten.immer". – David
Deine Vorraussetzung für die Typen ist ziemlich garantiert, wenn 'moveMaybeCreature 'an erster Stelle geprüft wird ... –