2014-11-16 5 views
7

Ich habe den folgenden Code:Haskell - How to use <- in where-Klauseln

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) 

Jetzt möchte ich die "x < - bar 6" setzen Teil in einer where-Klausel, wie folgt aus:

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) 

Wie mache ich das?

Antwort

15

Dies ist nicht erlaubt. Eine where Klausel schreibt keine Bewertungsreihenfolge vor, die für die meisten Monaden notwendig ist, wie IO. Wenn dies möglich wäre, wann würde bar 6 relativ zu den beiden print s ausgeführt werden? Wäre es am Anfang oder zwischen ihnen?

+0

Das macht Sinn. Vielen Dank! –

5

Wie mache ich das?

Es macht keinen Sinn. Es tut mir Leid.

Die folgenden, in einem do Block:

a <- b 
c 

entspricht:

b >>= (\a -> c) 

So a <- b allein wäre äquivalent zu: b >>= (\a ->) die eine Grammatikfehler.

Sie müssen x in einem where-Klausel sowieso nicht speichern. In Ihrem Programm:

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

nach x <- bar 6, können Sie x überall im do Block wiederverwenden.