2014-11-16 12 views
7

ho il seguente codice:Haskell - Come usare <- nelle clausole WHERE

foo :: Int -> IO() 
foo n = do 
    x <- bar 6 
    print "foo running..." 
    print x 


bar :: Int -> IO Int 
bar n = do 
    print "bar running..." 
    return (n*2) 

Ora voglio mettere la "x < - bar 6" parte in una clausola in cui, in questo modo:

foo :: Int -> IO() 
foo n = do 
    print "foo running..." 
    print x 
    where 
     x <- bar 6 

bar :: Int -> IO Int 
bar n = do 
    print "bar running..." 
    return (n*2) 

Come posso fare?

risposta

15

Questo non è consentito. Una clausola where non impone un ordine di valutazione, che è necessario per la maggior parte delle Monade, come ad esempio IO. Se ciò fosse possibile, quando si dovrebbe eseguire bar 6 relativamente ai due print s? Sarebbe all'inizio o tra di loro?

+0

Questo ha senso. Grazie! –

5

Come posso fare?

Non ha senso. Mi dispiace.

Di seguito, in un blocco do:

a <- b 
c 

è equivalente a:

b >>= (\a -> c) 

così solo a <- b, sarebbe equivalente a: b >>= (\a ->) che è un errore di grammatica.

Non è necessario memorizzare x in una clausola where. Nel programma:

foo :: Int -> IO() 
foo n = do 
    x <- bar 6 
    ... 

dopo x <- bar 6, è possibile riutilizzare x ovunque all'interno del blocco do.

Problemi correlati