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
并仅打开您认为重要的警告。
我运行进入了下面的错误,这很奇怪。我在 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
并仅打开您认为重要的警告。