我遇到了以下错误,这非常令人惊讶。我AppSettings
在Yesod应用程序中使用yesod scaffholding向Yesod应用程序中添加了一个字段,令我惊讶的是,即使我没有做任何其他事情,所有内容都已编译(我原本必须在的构造中添加一个默认值AppSettings
,但是不是)。我遇到了运行时错误,却告诉我缺少一个字段。看来,唯一AppSetting
使用RecordWildCards
扩展名的结构看起来像AppSettings{..}
。不定义新字段不会产生错误,而是发出警告(我没有看到它,因为我正在使用进行连续模式测试stack test --file-watch
)。那怎么可能呢?我尝试在一个简单的文件中重现该问题,但出现错误而不是警告。那么,为什么我会收到Yesod的警告?是编译标志还是其他东西?
这不是特定于Yesod的。我已经用一个简单的文件再次进行了测试,它会生成警告而不是错误。
根据GHC中的更改日志,“那不是错误,而是功能”:https : //ghc.haskell.org/trac/ghc/ticket/5334
您可以通过将字段的类型更改为strict来更改此行为(在a之前!
键入name-like !Int
)-但是,您会失去懒惰(更多关于严格类型的影响:严格类型在数据类型中的优势)
当然,您也可以通过猛烈地-Werror
编译选项来使其出错,但是随后您需要对代码非常严格(没有未使用的导入,没有任何未使用的变量,即使在解压缩记录时也是如此),或者摆脱-Wall
和仅打开您认为重要的警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句