On Oct 10, 2006, at 12:04 PM, Seth Gordon wrote:

data Secret a = Secret {password :: String, value :: a}

classify :: String -> a -> Secret a
classify = Secret

declassify :: String -> Secret a -> Maybe a
declassify guess (Secret pw v) | guess == pw = Just v
                                            | otherwise = Nothing

Put that in a module, do not export the Secret data type, and you're
good to go. I'm unsure what a Monad is giving you....

I was just curious if I could do that within a monad.

If the answer to my question is "no, you can't", then I'll pick up the
shattered pieces of my life and move on.  :-)


I think you can. Your original monad is just a little too simplistic. Try something like this (untested):


import Control.Monad.State

type Password = String
type Secret s a = State (Password -> Maybe s) a

classify :: Password -> s -> Secret s ()
classify pw s = put (\x -> if x == pw then Just s else Nothing)

declassify :: Password -> Secret s (Maybe s)
declassify pw = get >>= \f -> return (f pw)

runSecret :: Secret s a -> a
runSecret m = runState m (const Nothing)


Note how this relies on "opaque" functions to hide the secret. This wouldn't work if Haskell had intensional observation of functions, although you could still use a newtype in that case.


Slightly related: I've sometimes wondered about a monadic API for cryptographic primitives. With compiler support you could do nifty things like make sure to use non-swappable memory for encryption keys and use fancy special purpose hardware for cryptographic primitives, if available. The API would give a nice way to ensure proper information hiding policy. Has anything like this been done or studied?



Rob Dockins

Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
          -- TMBG



_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to