Hello,<br><br>I have just a very vague understanding of what homomorphic encryption is, but I was wondering if homomorphic encryption behaves as a one-way monad (like IO).<br><br>So for example, suppose you wrote a function that worked on encrypted email to determine if it spam, maybe it looks like this:<br>
isSpam :: Cypher String -&gt; Cypher Bool<br><br>I could be mistaken about the way this works, but it seems that isSpam can&#39;t return a plain &#39;Bool&#39; because then you could know things about the encrypted data without having to decrypt it first.  So that is why I think it has to return &quot;Cypher Bool&quot;.<br>
<br>And because it&#39;s a homomorphic encryption, you could have something like doWork:<br>doWork :: Cypher a -&gt; (a -&gt; b) -&gt; Cypher b<br><br>Which we could use to implement isSpam:<br><br>isSpam s = doWork s spamTest<br>
  where spamTest :: String -&gt; Bool<br><br>I initially thought that doWork should be (&gt;&gt;=), but it seems the type of the function should either be (a -&gt; b) or (Cypher a -&gt; Cypher b).  That is, return :: a -&gt; Cypher a, is not available.  All the data should already be encrypted.  Thinking about it a bit more, since we never have to decrypt the data to work with it, it seems that (a -&gt; b) is wrong as well, because we don&#39;t have the key or whatever to do the decrypting.<br>
<br>So, then it seems reasonable that the only type for doWork is this:<br>doWork :: Cypher a -&gt; (Cypher a -&gt; Cypher b) -&gt; Cypher b<br><br>Which doesn&#39;t really seem all that useful now.<br><br>On the other hand, maybe we have an algorithm which can take a function on normal values and gives us a function on Cypher values:<br>
<br>enCypher :: (a -&gt; b) -&gt; Cypher a -&gt; Cypher b<br><br>Or perhaps, it should be:<br><br>enCypher :: (a -&gt; b) -&gt; Cypher (a -&gt; b)<br><br>Which would match the type of return.<br><br>If that is the type of return, then we probably want:<br>
(&gt;&gt;=) :: Cypher (a -&gt; b) -&gt; ((a -&gt; b) -&gt; Cypher (c -&gt; d)) -&gt; Cypher (c -&gt; d)<br><br>At this point, I&#39;m not actually sure if the second type for enCypher makes any sense.  But, if it does, then I think it says the purpose of the monad is to act on the transformations and not the data.  That is, instead of focusing on the data as being held in the cypher, we are thinking of the functions as being transformed into a cypher space.<br>
<br>Has anyone else been thinking about this?<br><br>Jason<br>