给定数据类型
data Foo = Foo { one :: Int, two :: String } deriving (Show)
不完整的表达式通过了类型检查 - 例如
foo :: Foo
foo = Foo { one = 5 }
main = print foo
Typechecks(发出关于不完整记录的警告),然后(显然)遇到表达式时崩溃。它为什么通过?没有记录语法,它不会(即bar = Foo 5 :: Foo
)。
答案 0 :(得分:10)
Haskell 2010报告在3.15.2 Construction Using Field Labels
部分中说明带有标记字段的构造函数可用于构造一个值,其中组件是按名称而不是按位置指定的。与声明列表中使用的大括号不同,它们不受布局的限制; {和}字符必须是显式的。 (对于字段更新和字段模式也是如此。)使用字段标签的构造受以下约束条件限制:[...]
未提及的字段初始化为⊥。
在构造期间省略任何严格字段(其声明类型以前缀为!的字段)时发生编译时错误。
所以它是语言规范的一部分,编译器必须接受代码。所有字段都已初始化,只有一些字段使用undefined
初始化。
foo = Foo{ one = 5 }
相当于
foo = Foo 5 undefined
如果你问的话,一个不错的编译器会警告你。如果您想要出错,请将字段设为严格。