<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 (toEnum n)</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 + fromEnum 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 + fromEnum (maxBound :: a))</span><br><span style="font-family: courier new, serif;">        in toEnum r : toEnum 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 + fromEnum x + (1 + fromEnum (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=J%2FRCbHFTpz%2FYaqgZKrRZpzUZp6JoM6p0pxvdpo3vK6MZFrp0pAEXFAioMoigMX%2B0Mou974lR74lcWNFlbX30WLloWrdQarwGMNiCb400bdIcMBFOp6wn74eZpm%3D%3D.gif" border="0"/></td></tr></table>