<html><head><style>p{margin-top:0px;margin-bottom:0px;}</style></head><body><!--  --><div style="font-size:10pt; font-family:Gulim, sans-serif;"><p><span style="font-family: courier new, serif;">For use of ciphers (SHA-256, RSA-2048, etc.), a type must be able to be injectively mapped to integers. It seems `Enum` is currently the closest thing that does this. </span><br><br><span style="font-family: courier new, serif;">But `Enum` is supposed to be for arithmetic sequences, so it seems better to define a new typeclass. (Here named `Cipherable`) </span></p><p> </p><p><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"> Here, `Cipherable` has `deCipher :: Natural -> a` and `enCipher :: a -> Natural`.</span><br><br><span style="font-family: courier new, serif;">There are some types that aren't members of `Enum`. For example, `Maybe`, `[]`, etc. They seem okay to be Cipherable. Hence:</span><br><br><span style="font-family: courier new, serif;"> </span><br><br><span style="font-family: courier new, serif;"> </span><br><span style="font-family: courier new, serif;">{-# LANGUAGE ScopedTypeVariables #-}</span><br><span style="font-family: courier new, serif;"> </span><br><span style="font-family: courier new, serif;">instance Cipherable a => Cipherable (Maybe a) where</span><br><span style="font-family: courier new, serif;">    deCipher 0 = Nothing</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span> n = Just (</span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span></span> (n-1))</span><br><span style="font-family: courier new, serif;">    enCipher Nothing  = 0</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span> (Just x) = 1 + </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span></span> x</span><br><br><span style="font-family: courier new, serif;">instance forall a. (Cipherable a, Bounded a) => Cipherable [a] where</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span> 0 = []</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span> n = let</span><br><span style="font-family: courier new, serif;">        (q,r) = (n-1) `quotRem` (1 + </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span></span> (maxBound :: a))</span><br><span style="font-family: courier new, serif;">        in </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span></span> r : </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span></span> q</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span> []     = 0</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span> (x:xs) = 1 + </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span></span> x + (1 + </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">enCipher</span></span> (maxBound :: a)) * fromEnum xs</span><br><br><span style="font-family: courier new, serif;">instance Cipherable Void where</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span> = errorWithoutStackTrace "Cipher.Cipherable.Void.</span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;"></span><span style="font-family: courier new, serif;"><span style="font-family: courier new, serif;">deCipher</span></span>"</span><br><span style="font-family: courier new, serif;">    </span><span style="font-family: courier new, serif;">enCipher</span><span style="font-family: courier new, serif;"> = absurd</span><br><span style="font-family: courier new, serif;"> </span><br><span style="font-family: courier new, serif;"> </span><br><span style="font-family: courier new, serif;">(Besides, it is possible to re-write that of `[]` without ScopedTypeVariables? I see no way...)</span><br> </p></div>

</body></html><table style='display:none'><tr><td><img src="https://mail.naver.com/readReceipt/notify/?img=JPRCbHFTpz%2FYaqgZKrRZMrkSpxMXpo%2BSMqgrpA2%2FpoUXp4F0KovqK6trMxCSpEIo%2BrkSKAE5W4d5W4C5bX0q%2BzkR74FTWx%2FsWz0Sb4JZ16kqtzCCbrR0Wzm5WXiN.gif" border="0"/></td></tr></table>