[[project @ 2002-02-11 15:21:20 by simonpj]
simonpj**20020211152120
Documentation for kinded declarations
] {
hunk ./ghc/docs/users_guide/glasgow_exts.sgml 2165
-
-Assertions
-Assertions
-
-
-
-If you want to make use of assertions in your standard Haskell code, you
-could define a function like the following:
-
-
-
-
-
-assert :: Bool -> a -> a
-assert False x = error "assertion failed!"
-assert _ x = x
-
-
-
-
-
-which works, but gives you back a less than useful error message --
-an assertion failed, but which and where?
-
-
-
-One way out is to define an extended assert function which also
-takes a descriptive string to include in the error message and
-perhaps combine this with the use of a pre-processor which inserts
-the source location where assert was used.
-
-
-
-Ghc offers a helping hand here, doing all of this for you. For every
-use of assert in the user's source:
-
-
-
-
-
-kelvinToC :: Double -> Double
-kelvinToC k = assert (k >= 0.0) (k+273.15)
-
-
-
-
-
-Ghc will rewrite this to also include the source location where the
-assertion was made,
-
-
-
-
-
-assert pred val ==> assertError "Main.hs|15" pred val
-
-
-
-
-
-The rewrite is only performed by the compiler when it spots
-applications of Exception.assert, so you can still define and
-use your own versions of assert, should you so wish. If not,
-import Exception to make use assert in your code.
-
-
-
-To have the compiler ignore uses of assert, use the compiler option
-. -fignore-asserts option That is,
-expressions of the form assert pred e will be rewritten to e.
-
-
-
-Assertion failures can be caught, see the documentation for the
-Exception library ()
-for the details.
-
-
-
-
hunk ./ghc/docs/users_guide/glasgow_exts.sgml 2546
+
+
+
+Explicitly-kinded quantification
+
+
+Haskell infers the kind of each type variable. Sometimes it is nice to be able
+to give the kind explicitly as (machine-checked) documentation,
+just as it is nice to give a type signature for a function. On some occasions,
+it is essential to do so. For example, in his paper "Restricted Data Types in Haskell" (Haskell Workshop 1999)
+John Hughes had to define the data type:
+
+ data Set cxt a = Set [a]
+ | Unused (cxt a -> ())
+
+The only use for the Unused constructor was to force the correct
+kind for the type variable cxt.
+
+
+GHC allows you to specify the kind of a type variable directly, wherever
+a type variable is explicitly bound. Namely:
+
+data declarations:
+
+ data Set (cxt :: * -> *) a = Set [a]
+
+type declarations:
+
+ type T (f :: * -> *) = f Int
+
+class declarations:
+
+ class (Eq a) => C (f :: * -> *) a where ...
+
+forall's in type signatures:
+
+ f :: forall (cxt :: * -> *). Set cxt Int
+
+
+
+
+
+The parentheses are required. Some of the spaces are required too, to
+separate the lexemes. If you write (f::*->*) you
+will get a parse error, because "::*->*" is a
+single lexeme in Haskell.
+
+
+
+As part of the same extension, you can put kind annotations in types
+as well. Thus:
+
+ f :: (Int :: *) -> Int
+ g :: forall a. a -> (a :: *)
+
+The syntax is
+
+ atype ::= '(' ctype '::' kind ')
+
+The parentheses are required.
+
+
+
+
+Assertions
+Assertions
+
+
+
+If you want to make use of assertions in your standard Haskell code, you
+could define a function like the following:
+
+
+
+
+
+assert :: Bool -> a -> a
+assert False x = error "assertion failed!"
+assert _ x = x
+
+
+
+
+
+which works, but gives you back a less than useful error message --
+an assertion failed, but which and where?
+
+
+
+One way out is to define an extended assert function which also
+takes a descriptive string to include in the error message and
+perhaps combine this with the use of a pre-processor which inserts
+the source location where assert was used.
+
+
+
+Ghc offers a helping hand here, doing all of this for you. For every
+use of assert in the user's source:
+
+
+
+
+
+kelvinToC :: Double -> Double
+kelvinToC k = assert (k >= 0.0) (k+273.15)
+
+
+
+
+
+Ghc will rewrite this to also include the source location where the
+assertion was made,
+
hunk ./ghc/docs/users_guide/glasgow_exts.sgml 2660
+
+
+
+assert pred val ==> assertError "Main.hs|15" pred val
+
+
+
+
+
+The rewrite is only performed by the compiler when it spots
+applications of Exception.assert, so you can still define and
+use your own versions of assert, should you so wish. If not,
+import Exception to make use assert in your code.
+
+
+
+To have the compiler ignore uses of assert, use the compiler option
+. -fignore-asserts option That is,
+expressions of the form assert pred e will be rewritten to e.
+
+
+
+Assertion failures can be caught, see the documentation for the
+Exception library ()
+for the details.
+
}