Auf einer Rückkehr von einem vielleicht, das “gerade” enthält, operierend

Ich habe eine function, die einen Rückgabetyp von Maybe ([(Int,Int)],(Int,Int))

Ich möchte dies von einer anderen function aufrufen und eine Operation an den Daten durchführen.

Der Rückgabewert ist jedoch in Just . Die zweite Methode verwendet ([(Int,Int)],(Int,Int)) und akzeptiert daher nicht Just ([(Int,Int)],(Int,Int)) .

Gibt es einen Weg, wie ich das ” Just trimmen kann, bevor ich die zweite Methode anwende?

Ich verstehe den Gebrauch von Just in Maybe nicht ganz – aber mir wurde gesagt, dass der Rückgabetyp für die erste Methode Maybe muss.

   

Es gibt mehrere Lösungen für Ihr Problem, die alle auf dem Mustervergleich basieren. Ich nehme an, Sie haben zwei Algorithmen (da Sie sie nicht benannt haben, werde ich):

 algorithm1 :: a -> Maybe b algorithm2 :: b -> c input :: a 

1) Die Mustererkennung erfolgt in der Regel entweder aus einer case-statement (unten) oder einer function.

 let val = algorithm1 input in case val of Nothing -> defaultValue Just x -> algorithm2 x 

Alle anderen präsentierten Lösungen verwenden Mustervergleiche, ich präsentiere nur Standardfunktionen, die die Mustererkennung für Sie durchführen.

2) Der Auftakt (und Data.Maybe) haben einige eingebaute functionen, um Maybe s zu behandeln. Die vielleicht function ist eine großartige, ich schlage vor, Sie verwenden es. Es ist in Standardbibliotheken definiert als:

 maybe :: c -> (b -> c) -> Maybe b -> c maybe n _ Nothing = n maybe _ f (Just x) = fx 

Ihr Code würde folgendermaßen aussehen:

 maybe defaultValue algorithm2 (algorithm1 input) 

3) Da Maybe ein Funktor ist , könnte man fmap verwenden . Dies ist sinnvoller, wenn Sie keinen Standardwert haben. Die Definition:

 instance Functor Maybe where fmap _ Nothing = Nothing fmap f (Just a) = Just (fa) 

Ihr Code würde also wie folgt aussehen:

 fmap algorithm2 (algorithm1 input) 

Diese Ausgabe ist ein Maybe Wert ( Nothing wenn das Ergebnis von Algorithmus1 Nothing ).

4) Schließlich, und stark davon abgeraten, ist fromJust . Verwenden Sie es nur, wenn Sie sicher sind, dass der erste Algorithmus Just x (und nicht Nothing ) Nothing . Achtung! Wenn Sie fromJust val wenn val = Nothing Sie eine Ausnahme, die in Haskell nicht fromJust val wird. Seine Definition:

 fromJust :: Maybe b -> b fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck fromJust (Just x) = x 

Lassen Sie Ihren Code so aussehen:

 algorithm2 (fromJust (algorithm1 input)) 

Sie suchen fromJust . Aber nur wenn du sicher bist , dass deine Maybe function kein Nothing !