2010-09-04 7 views
31

Ich versuche, den Maybe-Typ in Haskell zu verwenden. Ich suche nach Schlüsseln, Werttupeln, die ein Maybe zurückgeben. Wie greife ich auf die Daten zu, die von Maybe verpackt wurden? Zum Beispiel möchte ich die von Maybe enthaltene Ganzzahl mit einer anderen Ganzzahl ergänzen.Using Vielleicht geben Sie Haskell ein

+1

Dies ist eine doppelte: http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that -contains-nur/3375712 # 3375712 –

Antwort

31

Alternativ können Sie Mustervergleich:

case maybeValue of 
    Just value -> ... 
    Nothing -> ... 
+1

Das war mehr wie das, was ich versuchte, als die Antwort, die ich gefunden hatte. Danke – dpsthree

+1

Was soll ich in der Typdeklaration sagen? – qed

3

Sorry, ich hätte besser googeln sollen.

mit der Funktion fromMaybe ist genau das, was ich brauche. fromMaybe gibt den Wert in Maybe zurück, wenn es nicht nichts ist, andernfalls wird ein Standardwert von fromMaybe zurückgegeben.

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html

+6

Ja, aber stellen Sie sicher, dass das das Verhalten ist, das Sie wollen, denn wenn Sie zum Beispiel eine Maybe Int verwenden und dann jedes Mal, wenn es nichts ist, geben Sie Null zurück, dann sollten Sie haben habe einfach von Anfang an einen einfachen alten Int benutzt. Vielleicht soll es helfen, die Abwesenheit eines Ergebnisses oder Wertes zu kodieren und nicht wirklich umgangen zu werden. Persönlich versuche ich so wenig wie möglich von der myBear Funktion zu steuern. –

18

könnten Sie Data.Maybe.fromMaybe verwenden, die einen Maybe a und einen Wert annimmt, zu verwenden, wenn es Nothing ist. Sie könnten das unsichere Data.Maybe.fromJust verwenden, das nur abstürzen wird, wenn der Wert Nothing ist. Sie möchten wahrscheinlich Dinge in Maybe behalten. Wenn Sie eine ganze Zahl in einem Maybe hinzufügen möchten, können Sie so etwas wie

f x = (+x) <$> Just 4 

tun, die die gleiche wie

ist
f x = fmap (+x) (Just 4) 

f 3 dann Just 7 sein wird. (Sie können auf diese Weise an die Kette zusätzliche Berechnungen fortzusetzen.)

+0

'f 3' wird' Nur 7', nicht '7'. – Yitz

+0

Bearbeitet entsprechend. – jrockway

8

nur als Randnotiz: Da Maybe ein Monad ist, können Sie bauen Berechnungen mit do -Notation ...

sumOfThree :: Maybe Int 
sumOfThree = do 
    a <- someMaybeNumber 
    b <- someMaybeNumber 
    c <- someMaybeNumber 
    let k = 42 -- Just for fun 
    return (a + b + c + k) 
8

Beispiele für "vielleicht":

> maybe 0 (+ 42) Nothing 
0 
> maybe 0 (+ 42) (Just 12) 
54 
4

Viele Menschen sind gegen den Einsatz von fromJust, aber es zweckmäßig sein kann, wenn Sie wissen, was passieren wird, wenn die Suche fehlschlägt (Fehler !!)

Zum einen müssen Sie dies:

import Data.Maybe 

Und dann Nachschlag aus einer Liste von Tupeln wie diese

Data.Maybe.fromJust $ lookup key listOfTuples 

Zum Beispiel erfolgreicher Lookup aussehen:

Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)] 
1 

Und schreckliche Versagen sieht wie folgt aus:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)] 
*** Exception: Maybe.fromJust: Nothing 
Verwandte Themen