[Haskell-cafe] data Color3 a = Color3 !a !a !a
ryani.spam at gmail.com
Tue Jul 8 13:20:31 EDT 2008
A simple example to help understand the difference
> data NoStrict a = NoStrict a deriving Show
> data Strict a = Strict !a deriving Show
> ns1 = NoStrict ()
> ns2 = NoStrict undefined
> ns3 = undefined
> nf1 (NoStrict ()) = "ok"
> nf2 (NoStrict _) = "ok"
> s1 = Strict ()
> s2 = Strict undefined
> s3 = undefined
> f1 (Strict ()) = "ok"
> f2 (Strict _) = "ok"
The difference between these:
*Strict> nf2 ns2
*Strict> f2 s2
"*** Exception: Prelude.undefined
s2 and s3 are both the same (undefined), while ns2 and ns3 are different.
As to why you'd want that behavior? Here are a couple of reasons:
1) You can avoid hiding exceptions in strict data structures; if the
top level evaluates, you know the entire structure is valid.
2) With -funbox-strict-fields, the compiler can remove a level of
indirection; the performance difference between a structure that
contains three machine words and a structure that contains three
pointers to boxed integers is pretty significant.
On the other hand, you lose the benefits of laziness; I find most
"structure-like" data structures work better strict, but that
"list-like" data structures definitely gain an advantage from
2008/7/8 Daryoush Mehrtash <dmehrtash at gmail.com>:
> Can some one explain what the !a does in this:
> data Color3 a = Color3 !a !a !a
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
More information about the Haskell-Cafe