Я читаю эту статью. Он гласит:
При построении значения с синтаксисом записи GHC выдаст вам ошибку, если вы забудете строгое поле. Это даст вам предупреждение только для нестрогих полей.
Может ли кто-нибудь привести мне конкретный пример этого?
Я читаю эту статью. Он гласит:
При построении значения с синтаксисом записи GHC выдаст вам ошибку, если вы забудете строгое поле. Это даст вам предупреждение только для нестрогих полей.
Может ли кто-нибудь привести мне конкретный пример этого?
Банальный пример:
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