piątek, lipca 18, 2008

Wyrafinowany sposób na wyjątek

Właśnie drogą eksperymentu doszedłem, jak zapętlić GHC... ale tak, by się zorientował i rzucił wyjątkiem :-)

Wystarczy nam taki kod:

> {-# OPTIONS_GHC -XRecursiveDo #-}
>
> module Main where
>
> import Control.Concurrent
> import Control.Monad.Fix
>
> loopChan :: IO (Chan ())
> loopChan = mdo chan <- dupChan chan
> return chan
>
> main = do
> c <- loopChan
> writeChan c ()

Kiedy spróbujemy go załadować do GHCi:

> Prelude> :l loop_channel.hs
> [1 of 1] Compiling LC ( loop_channel.hs, interpreted )
> Ok, modules loaded: LC.
> *LC> :type loopChan
> loopChan :: IO (Chan ())
> *LC> c <- loopChan
> *** Exception: <>

Lub wykonać:
> [Tener@laptener loop_chan]$ ghc --make loop_channel.hs
> [1 of 1] Compiling Main ( loop_channel.hs, loop_channel.o )
> Linking loop_channel ...
> [Tener@laptener loop_chan]$ ./loop_channel
> loop_channel: <>


To przytrafi nam się to samo: dostajemy wyjątek NonTermination. Co stanie się przy próbie uruchomienia tego kodu było dla mnie zagadką, gdy go pisałem - rzucenie tego wyjątku wydaje się być rozsądnym rozwiązaniem.

Brak komentarzy:

Prześlij komentarz