Ошибка GHC из-за отсутствия строгих полей

avatar
Marronnier
8 апреля 2018 в 06:25
183
1
2

Я читаю эту статью. Он гласит:

При построении значения с синтаксисом записи GHC выдаст ошибку, если вы забудете строгое поле. Это даст вам предупреждение только для нестрогих полей.

Кто-нибудь может привести конкретный пример этого?

Источник

Ответы (1)

avatar
duplode
8 апреля 2018 в 06:45
5

Простой пример:

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

bar — строгое поле, а baz — нестрогое. Для начала забудем 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}

Мы получаем предупреждение, но x создается. (Обратите внимание, что предупреждение печатается по умолчанию в GHCi при использовании stack ghci. Возможно, вам придется использовать :set -Wall, чтобы увидеть его в обычном GHCi; я не совсем уверен.) Попытка использовать baz в x естественно доставляет нам неприятности...

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

... хотя мы можем легко добраться до bar:

GHCi> bar x
3

Если мы забудем bar, мы не сможем даже построить значение, начинающееся с:

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