2013-06-21 12 views
8

Proszę rozważyć ten kod:Jak zoptymalizować zagnieżdżone wzorce pasujące do wielu powtarzających się przypadków?

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" 

Widać, że muszę powtarzać dwa razy: z Right oraz z error przypadkach.

Jak mogę to zoptymalizować? Czy to w ogóle możliwe?

+2

Twój cień zmienna 'A' nie jest tak ładny, jest to? Najpierw naszkicowałem to niewinnie, ale łamie to moje rozwiązanie. – leftaroundabout

Odpowiedz

4

bym umieścić błąd obsługi część poza case części:

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

Muszę powiedzieć, że z idiomatycznego punktu widzenia jest to bardzo dobre rozwiązanie. Dzięki! –

10

To dobra aplikacja dla 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

Dzięki! Miła propozycja. –

Powiązane problemy