[Haskell-cafe] Another question about unsafePerformIO

Matthias Görgens matthias.goergens at googlemail.com
Thu Jun 25 10:02:32 EDT 2009


> Adding 'unsafePerformIO' will work, but a better idea might be to
> understand why your solver has IO in its type signature. Is this because
> of FFI calls? You can remove IO in FFI calls if they are free from side
> effects as well.

My solver has IO in the type signature, because I said so. :o)  The
solve function is defined like this:

> solve :: Constraints -> IOMayfail Solution
> solve constraints = do { solString <- scip (genZimpl constraints);
>                        parseSol nfnrs solString;}

> scip :: String -> IOMayfail String
> scip zimplCode = do {lift $ writeFileAtomic zplFile zimplCode;
>                     exitCode <- lift $ system (command zplFile solFile);
>                     case exitCode of ExitSuccess -> lift (readFile solFile)
>                                      ExitFailure n -> fail ("Calling Scip failed with code "++ show n ++".\n");}

> command inFile outFile = "./scip -c 'read \"" ++ inFile ++"\"' -c 'optimize' "
>                          ++"-c 'write solution \""++outFile++"\"' -c 'quit'"

(I added {}; because I some mail clients use variable width fonts and
mess up layout. Eg mine does.)

The solver SCIP also offers a FFI interface.  But I was too lazy to
use that, yet.  So I use a temp-file (which should really use
openTempFile instead of a fixed name) for communication.

So because of my lazyness there are still things in it that look like
side-effects, but they are not so in principal.  (Also I am the only
user of my code, so I can get away with deferring true FFI.)

Matthias.


More information about the Haskell-Cafe mailing list