Recordwildcards 在运行时在 yesod 应用程序中崩溃

Recordwildcards crashes at runtime in yesod app

我运行进入了下面的错误,这很奇怪。我在 Yesod 应用程序(使用 Yesod 脚手架)中向 AppSettings 添加了一个字段,令我惊讶的是,即使我没有做任何其他事情,所有内容都已编译(我期望必须在某处添加默认值AppSettings 的构造,但不是)。我得到了一个运行时错误,而不是告诉我缺少一个字段。 AppSetting 的唯一构造似乎使用了 RecordWildCards 扩展,看起来像 AppSettings{..}。未定义新字段不会生成错误,而是会生成警告(我没有看到它,因为我使用 stack test --file-watch 在连续模式下进行了 运行 测试)。这怎么可能? 我尝试在一个简单的文件中重现该问题,但我得到的是错误而非警告。那么为什么我会收到 Yesod 的警告?是编译标志还是什么?

编辑

这不是 Yesod 特有的。我用一个简单的文件再次进行了测试,它生成的是警告而不是错误。

根据 GHC 中的变更日志,"that not a bug, it's a feature":https://ghc.haskell.org/trac/ghc/ticket/5334

您可以通过将字段类型更改为严格来更改此行为(在 ! 前添加名称 - 如 !Int)- 但是,您会失去惰性(更多关于严格的影响类型:Advantages of strict fields in data types)

当然,你也可以通过在 -Werror 编译选项中猛击让它成为一个错误,但是你需要对你的代码非常严格(没有未使用的导入,没有未使用的变量,即使在解包时记录等),或删除 -Wall 并仅打开您认为重要的警告。