2013-05-24 10 views
7

mi chiedevo il modo corretto ed elegante per fare una cosa simileCome fare un se poi il resto se la struttura di controllo come espressione (in un modo carino)

function candy = case (color candy) of 
    Blue -> if (isTasty candy) then eat candy 
      else if (isSmelly candy) then dump candy 
      else leave candy 

ho provato

function candy = case (color candy) of 
    Blue -> dealWith candy 
     where dealWith c 
       | isTasty c = eat candy 
       | isSmelly c = dump candy 
       | otherwise = leave candy 

Qualcuno sa come migliorare su questo?

PIÙ

So che posso usare questa

function candy = case (color candy) of 
    Blue -> case() of 
       _ | isTasty candy -> eat candy 
        | isSmelly candy -> dump candy 
        | otherwise -> leave candy 

Ma usando un case pur non corrispondenti nulla solo non sembra essere la strada giusta.

risposta

16

È possibile utilizzare guardie direttamente in esterno case espressione.

fun candy = case color candy of 
    Blue | isTasty candy -> eat candy 
     | isSmelly candy -> dump candy 
     | otherwise  -> leave candy 
+0

Alla fine sono andato con il tuo approccio. Tuttavia, vorrei sapere la risposta al perché avere una definizione di funzione in dove non funziona – lynnard

+0

@ yulan6248: Funziona bene qui. Ti è permesso avere una clausola 'where' su ogni alternativa di un' caso', e sono condivisi tra guardie, proprio come su una funzione. Vedi [il rapporto Haskell] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-460003.13) per i dettagli. – hammar

+0

Thx, il mio male, è un problema di indentazione. Sono un super-principiante di Haskell e sopporto me per aver fatto domande stupide – lynnard

3

È possibile creare una struttura simile a una tabella utilizzando le tuple. Sono conosciuta per fare questo:

function candy = case (color candy, isTasty candy, isSmelly candy) of 
    (Blue, True, _ ) -> eat candy 
    (Blue, _, True) -> dump candy 
    _     -> leave candy 
+0

Questo è un costrutto interessante; anche se un po 'ridondante in questo caso. Inoltre, non è possibile utilizzarlo se si dispone di funzioni booleane arbitrarie per valutare – lynnard

+0

Cosa si intende per "funzioni booleane arbitrarie"? –

+0

Hmm, forse ho sbagliato, si occupa della maggior parte delle situazioni. Immagino che il negativo sia che devi scrivere una lunga lista tupla se hai molti predicati da valutare – lynnard

11

È possibile utilizzare Multi-way if-expressions in GHC 7.6:

fun candy = case color candy of 
    Blue -> if | isTasty candy -> eat candy 
       | isSmelly candy -> dump candy 
       | otherwise -> leave candy 
+1

Urrà, qualcosa di nuovo imparato! Grazie! – lynnard

Problemi correlati