4 Stimmen

Zusammenstellung zweier fehlerauslösender Funktionen in Haskell

Das Problem, das mir gestellt wurde, lautet wie folgt:

Ähnlich wie bei mapMaybe definieren Sie die Funktion: composeMaybe :: (a->Maybe b) -> (b -> Maybe c) -> (a-> Maybe c) die zwei fehlerauslösende Funktionen zusammensetzt.

Der Typ Maybe a und die Funktion mapMaybe sind wie folgt kodiert:

data Maybe a = Nothing | Just a

mapMaybe g Nothing = Nothing
mapMaybe g (Just x) = Just (g x)

Ich habe versucht, eine Komposition wie diese zu verwenden:

composeMaybe f g = f.g

Aber es lässt sich nicht kompilieren.

Kann mir jemand die richtige Richtung weisen?

0voto

Greg Bacon Punkte 127209

Beachten Sie, wie nahe die Arten von composeMaybe Die Argumente des monadischen Bindungsoperators entsprechen dem, was er für sein letztes Argument wünscht:

ghci> :t (>>=)
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

Die Reihenfolge der f y g ist rückwärtsgewandt, wie wäre es also mit einem besseren Namen?

thenMaybe :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c) 
thenMaybe f g = (>>= g) . (>>= f) . return

Unter Berücksichtigung der folgenden Definitionen

times3 x = Just $ x * 3

saferecip x
  | x == 0 = Nothing
  | otherwise = Just $ 1 / x

kann man zum Beispiel,

ghci> saferecip `thenMaybe` times3 $ 4
Just 0.75
ghci> saferecip `thenMaybe` times3 $ 8
Just 0.375
ghci> saferecip `thenMaybe` times3 $ 0
Nothing
ghci> times3 `thenMaybe` saferecip $ 0
Nothing
ghci> times3 `thenMaybe` saferecip $ 1
Just 0.3333333333333333

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X