为什么这会记录类型检查?

时间:2013-01-30 18:53:37

标签: haskell record

给定数据类型

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

不完整的表达式通过了类型检查 - 例如

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

main = print foo

Typechecks(发出关于不完整记录的警告),然后(显然)遇到表达式时崩溃。它为什么通过?没有记录语法,它不会(即bar = Foo 5 :: Foo)。

1 个答案:

答案 0 :(得分:10)

Haskell 2010报告在3.15.2 Construction Using Field Labels

部分中说明
  

带有标记字段的构造函数可用于构造一个值,其中组件是按名称而不是按位置指定的。与声明列表中使用的大括号不同,它们不受布局的限制; {和}字符必须是显式的。 (对于字段更新和字段模式也是如此。)使用字段标签的构造受以下约束条件限制:[...]

     
      
  • 未提及的字段初始化为⊥。

  •   
  • 在构造期间省略任何严格字段(其声明类型以前缀为!的字段)时发生编译时错误。

  •   

所以它是语言规范的一部分,编译器必须接受代码。所有字段都已初始化,只有一些字段使用undefined初始化。

foo = Foo{ one = 5 }

相当于

foo = Foo 5 undefined

如果你问的话,一个不错的编译器会警告你。如果您想要出错,请将字段设为严格。