[Haskell-cafe] Serialization of (a -> b) and IO a

Alexander Solla ajs at 2piix.com
Fri Nov 12 16:18:51 EST 2010

On Nov 12, 2010, at 12:44 PM, Andrew Coppin wrote:

> Just today I was thinking about how useful it would be if you could  
> send a block of code from one PC to another to execute it remotely.  
> The fact that you can't do this is basically why there's no  
> distributed Haskell yet, despite what an obviously good idea that  
> would be. It would be really cool if we could do this.

What kind of code are you thinking about?  If you have a daemon  
waiting on a foreign machine, you can send it bytecode to  
deserialize.  The issue is one of /encodings/.  My "naive" approach  
(enumerating the functions domain, applying the function, and  
serializing a list of pairs of results) doesn't work so well because  
it is slow and big.  But it has all the properties we want, without  
having to go into the compiler and make enormous changes.  We need to  
find an efficient representation of a function in that can be  
serialized.  Haskell code is one option, but the compiler would need  
to pass it through to the run-time, so that the deserializer could run  
a compiler on it.  Passing some kind of intermediate level code  
through would work as well.  But we still face the same problem.  We  
need to compile the intermediate code into executable Haskell.

There is also the architecture independent approach I have described  
previously (with a "Serialize" type class, enumerating the functions  
domain and applying the function to each element, etc).  This is  
architecture independent in virtue of being implemented as plain old  
run-time Haskell.  It turns Haskell expressions into ByteStrings and  
back.  In short, the deserializer is an embedded compiler for "Haskell  
bytecode".  It interprets bytecode in terms architecture specific  
code.  To be honest, I'm not even sure how architecture independent  
Data.Binary and the like really are.  I'm guessing some care in the  
serialization library could fix any issue, though.

> And yes, it should of course be an IO operation. Because, let's face  
> it, any result it produces is inherantly going to be pretty random.  
> (Much like my favourite GHC function name, reallyUnsafePtrEquity#...)

Serialization and transport are orthogonal.  Serialization is pure.   
Transport is not.

More information about the Haskell-Cafe mailing list