Recordwildcards在运行时在yesod app

时间:2016-08-18 11:07:04

标签: haskell yesod

我遇到了以下错误,这是非常令人惊讶的。我在Yesod应用程序中使用了AppSettings添加了一个字段(使用Yesod脚手架),令我惊讶的是,即使我没有做任何其他事情,我编译了所有内容(我原本希望在默认情况下添加某个地方)值AppSettings的结构,但不是。我收到了运行时错误,而是告诉我字段丢失了。 似乎AppSetting的唯一构造使用RecordWildCards扩展名,看起来像AppSettings{..}。没有定义新字段并没有产生错误而是警告(我没有看到它,因为我使用stack test --file-watch在连续模式下运行测试)。怎么可能? 我尝试在一个简单的文件中重现问题,我收到错误而不是警告。那么为什么我会收到Yesod的警告?它是汇编标志还是什么?

修改

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

1 个答案:

答案 0 :(得分:1)

根据GHC的更新记录,“这不是一个错误,它是一个功能”:https://ghc.haskell.org/trac/ghc/ticket/5334

您可以通过将字段类型更改为strict来更改此行为(将!添加到类型名称之前 - 如!Int) - 然而,您会失去懒惰(更多关于严格类型的效果: Advantages of strict fields in data types

当然,您也可以通过抨击-Werror编译选项使其成为错误,但是您需要对代码非常严格(没有未使用的导入,没有未使用的变量,即使在解压缩记录等时也是如此) 。),或摆脱-Wall并仅启用您认为重要的警告。