2013-06-21 2 views
8

Bitte beachten Sie diesen Code:Wie optimiert man eine verschachtelte Musterübereinstimmung mit mehreren wiederholten Fällen?

case action1 of 
    Right a -> a 
    Left (Failure1 a) -> a 
    Left (Failure2 a) -> 
    case action2 a of 
     Right a -> a 
     _ -> error "Unexpected failure" 
    _ -> error "Unexpected failure" 

Sie können sehen, dass ich mich zweimal wiederholen: mit dem Right und mit den error Fällen.

Wie kann ich das optimieren? Ist es überhaupt möglich?

+2

Ihre beschattete Variable 'a' ist nicht so schön ist es? Ich habe es zunächst harmlos kopiert, aber es löst meine Lösung. – leftaroundabout

Antwort

4

ich den Fehler setzen würde Teil außerhalb des case Teilehandling:

fromMaybe (error "Unexpected failure") $ 
    let eitherToMaybe = either (const Nothing) Just 
    in case action1 of 
      Right a   -> Just a 
      Left (Failure1 a) -> Just a 
      Left (Failure2 a) -> eitherToMaybe (action2 a) 
      _     -> Nothing 
+1

Ich muss sagen, dass dies aus idiomatischer Sicht eine sehr schöne Lösung ist. Vielen Dank! –

10

Das ist eine gute Anwendung für pattern guards:

case action1 of 
    Right a -> a 
    Left f 
    | Failure1 a <- f  -> a 
    | Failure2 a <- f 
    , Right b <- action2 a -> b 
    _ -> error "Unexpected failure" 
+1

Danke! Ein schöner Vorschlag. –