
Quoth Dimitry Golubovsky
I see another solution: are there any hidden problems?
I found an interesting package, ChasingBottoms which contains a function testing a value to be bottom and returning a Boolean (of course it cannot be done without unsafePerformIO).
I borrowed the idea from that package, and wrote two functions:
unThrow :: (Exception e) => a -> Either e a
unThrow a = unsafePerformIO $ (E.evaluate a >>= return . Right) `E.catch` (\e -> return $ Left e)
Like Henning, I'm not going to try to predict a specific problem with it, but I don't like it. Have you had a chance to look at cereal (Data.Serialize)? I frankly couldn't make it do what you need, as written, but I could make it work if I modify Serialize.Get to export "Get(..)" instead of "Get".
From there I wrote a variant of the Get (>>=) function with an additional end-value-on-failure parameter, [] in your program:
ebind m g e = Get (\ s0 f k -> unGet m s0 (\ _ _ -> k B.empty e) (\ s a -> unGet (g a) s f k)) ... so to get your error bounded array of Int, getx = ebind get (\ a -> getx >>= return . (:) a) [] I think it's very likely there's a simpler way to do this with Data.Serial as written, I am just a little backwards with state monads and that kind of thing. Donn Cave, donn@avvanta.com