[haskell-cafe] Monad and kinds

Tim Chevalier catamorphism at gmail.com
Fri Sep 5 00:40:09 EDT 2008

On 9/4/08, Jake Mcarthur <jake.mcarthur at gmail.com> wrote:
>  I'm no master either, but how about these simple examples?
>         data Stream a = Cons !a (Stream a)
>         data Vector3 a = Vector3 !a !a !a
>  The compiler will certainly be able to infer the strictness itself in
>  most uses, so obviously the purpose for these annotations is not for
>  optimization, but I still would find these annotations useful. This is
>  much like explicitly giving the type for a function. It guides the
>  reader of the program, and just happens to also assist the compiler a
>  little bit.

But why not write your types like:
          data Stream a = Cons a <Stream a>
          data Vector3 a = Vector3 a a a
in a hypothetical call-by-value language where the <> annotation
denotes a lazily evaluated data structure? Does it matter? If it does,
then why? If it doesn't, then what would you conclude about whether a
language should encourage laziness or strictness?

>  If optimization is the only reason to worry about strictness, then
>  default laziness really _is_ treacherous. Luckily this is not the
>  case. Laziness is not useful without strictness, otherwise there would
>  never be any evaluation. Understanding how to apply laziness and
>  strictness in different situations is critical to writing efficient
>  but meaningful code in Haskell.

True, but both laziness and strictness exist in strict languages, as
well. What if, as a thought experiment, you tried substituting
"laziness" for "strictness" in that paragraph of your essay?


Tim Chevalier * http://cs.pdx.edu/~tjc * Often in error, never in doubt
"The Internet wasn't created for mockery, it was created to help
researchers at different universities share data sets." -- Homer

More information about the Haskell-Cafe mailing list