Safe Haskell  SafeInfered 

 data Form v m a
 data SomeForm v m = forall a . SomeForm (Form v m a)
 (.:) :: Text > Form v m a > Form v m a
 text :: Maybe Text > Form v m Text
 string :: Monad m => Maybe String > Form v m String
 stringRead :: (Monad m, Read a, Show a) => v > Maybe a > Form v m a
 choice :: Eq a => [(a, v)] > Maybe a > Form v m a
 bool :: Bool > Form v m Bool
 file :: Form v m (Maybe FilePath)
 check :: Monad m => v > (a > Bool) > Form v m a > Form v m a
 checkM :: Monad m => v > (a > m Bool) > Form v m a > Form v m a
 validate :: Monad m => (a > Result v b) > Form v m a > Form v m b
 validateM :: Monad m => (a > m (Result v b)) > Form v m a > Form v m b
Documentation
Base type for a form.
The three type parameters are:

v
: the type for textual information, displayed to the user. For example, error messages are of this type.v
stands for view. 
m
: the monad in which validators operate. The classical example is when validating input requires access to a database, in which case thism
should be an instance ofMonadIO
. 
a
: the type of the value returned by the form, used for its Applicative instance.
Forms
Validation
:: Monad m  
=> v  Error message (if fail) 
> (a > Bool)  Validating predicate 
> Form v m a  Form to validate 
> Form v m a  Resulting form 
Validate the results of a form with a simple predicate
Example:
check "Can't be empty" (not . null) (string Nothing)
checkM :: Monad m => v > (a > m Bool) > Form v m a > Form v m aSource
Version of check
which allows monadic validations
validate :: Monad m => (a > Result v b) > Form v m a > Form v m bSource
This is an extension of check
that can be used to apply transformations
that optionally fail
Example: taking the first character of an input string
head' :: String > Result String Char head' [] = Error "Is empty" head' (x : _) = Success x char :: Monad m => Form m String Char char = validate head' (string Nothing)