Erik Hesselink wrote:
> 
> If you want to use types instead of modules and hiding as Chris
> suggested, you can use a type index like this:
> 
> {-# LANGUAGE EmptyDataDecls, GADTs, KindSignatures #-}
> data Nothing
> data Just a
> 
> data Subject :: * -> * where
>   NoName :: Subject Nothing
>   Name   :: String -> Subject (Just String)
> 
> data Certificate a = Certificate
>   { subject :: Subject a }
> 
> validate :: Certificate a -> Maybe (Certificate (Just String))
> validate c =
>   case subject c of
>     NoName -> Nothing
>     Name n -> Just c
> 
> A "Certificate (Just String)" now always holds a name, and a
> "Certificate Nothing" doesn't. A "Certificate a" can hold either.
> 
> Erik
> 

Thanks, both of you. The GADT version seems slightly easier
to work with in our case.

-- 
View this message in context: 
http://old.nabble.com/Statically-tracking-%22validity%22---suggestions--tp29579872p29581285.html
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to