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 回答