3

指定されたデータ型

data Foo = Foo { one :: Int, two :: String } deriving (Show)

不完全な式は型チェックをパスします -- 例えば

foo :: Foo
foo = Foo { one = 5 }

main = print foo

型チェック (不完全なレコードに関する警告を発する) の後、(明らかに) 式に遭遇するとクラッシュします。なぜそれが通過するのですか?レコード構文がなければ、そうではありません (つまりbar = Foo 5 :: Foo)。

4

1 に答える 1

10

Haskell 2010 レポートは、セクション3.15.2 フィールド ラベルを使用した構築で述べています

ラベル付きフィールドを持つコンストラクターを使用して、コンポーネントが位置ではなく名前で指定される値を構築できます。宣言リストで使用される中かっことは異なり、これらはレイアウトの影響を受けません。{ および } 文字は明示的に指定する必要があります。(これは、フィールド更新とフィールド パターンにも当てはまります。) フィールド ラベルを使用した構築には、次の制約があります。[...]

  • 言及されていないフィールドは ⊥ に初期化されます。

  • 厳密なフィールド (宣言された型の前に ! が付いているフィールド) が構築中に省略されると、コンパイル時エラーが発生します。

したがって、これは言語仕様の一部であり、コンパイラはコードを受け入れる必要があります。すべてのフィールドが初期化されます。一部のみが で初期化されundefinedます。

foo = Foo{ one = 5 }

と同等です

foo = Foo 5 undefined

あなたが要求すれば、良いコンパイラはそれについて警告します。エラーが必要な場合は、フィールドを厳密にします。

于 2013-01-30T19:11:20.150 に答える