Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GHC error for missing strict fields

I'm reading this article. It reads:

When constructing a value with record syntax, GHC will give you an error if you forget a strict field. It will only give you a warning for non-strict fields.

Can anyone give me a concrete example of this?

like image 470
Marronnier Avatar asked Oct 28 '25 04:10

Marronnier


1 Answers

A trivial example:

GHCi> data Foo = Foo { bar :: !Int, baz :: String } deriving Show

bar is a strict field, while baz is non-strict. To begin with, let's forget baz:

GHCi> x = Foo { bar = 3 }

<interactive>:49:5: warning: [-Wmissing-fields]
    * Fields of `Foo' not initialised: baz
    * In the expression: Foo {bar = 3}
      In an equation for `x': x = Foo {bar = 3}

We get a warning, but x is constructed. (Note the warning gets printed by default in GHCi when using stack ghci. You might have to use :set -Wall to see it in plain GHCi; I'm not entirely sure.) Trying to use the baz in x naturally gets us in trouble...

GHCi> x
Foo {bar = 3, baz = "*** Exception: <interactive>:49:5-19: Missing field in record construction baz

... though we can reach bar just fine:

GHCi> bar x
3

If we forget bar, though, we can't even construct the value to begin with:

GHCi> y = Foo { baz = "glub" }

<interactive>:51:5: error:
    * Constructor `Foo' does not have the required strict field(s): bar
    * In the expression: Foo {baz = "glub"}
      In an equation for `y': y = Foo {baz = "glub"}
GHCi> y

<interactive>:53:1: error: Variable not in scope: y
like image 164
duplode Avatar answered Oct 29 '25 18:10

duplode



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!