2016-08-18 240 views
1

我遇到了以下錯誤,這是非常令人驚訝的。我在Yesod應用程序(使用Yesod scaffholding)中添加了一個字段到AppSettings,令我吃驚的是,即使我沒有做其他任何事情(我期望不得不在某處添加默認值AppSettings , 但不是)。我得到一個運行時錯誤,而是告訴我一個字段丟失。 看起來AppSetting的唯一構造使用RecordWildCards擴展名,看起來像AppSettings{..}。不定義新的字段不會產生錯誤,但會產生警告(我沒有看到它,因爲我正在使用stack test --file-watch以連續模式運行測試)。這怎麼可能? 我試圖在一個簡單的文件中重現問題,我得到的錯誤不是警告。那麼,爲什麼我會爲Yesod收到警告?它是一個彙編標誌或什麼?在yesod應用程序運行時崩潰記錄卡崩潰

編輯

這不是特定於Yesod。我用一個簡單的文件再次進行了測試,它會生成警告而不是錯誤。

+0

「這是彙編旗幟還是什麼?」 - 可能。這看起來像是一個「堆棧」問題,它將哪些設置傳遞給ghc? – user2407038

回答

1

根據GHC的changelog,「這不是一個錯誤,這是一個特點」:https://ghc.haskell.org/trac/ghc/ticket/5334

您可以通過更改字段的類型,以嚴格改變這種行爲(在前面加上一個!鍵入的名字 - 像!Int) - 不過,那你就失去懶惰(更多關於嚴格類型的影響:Advantages of strict fields in data types

當然,你也可以通過在-Werror編譯選項砰使它成爲一個錯誤,但是你需要非常嚴密的關於你的代碼(沒有未使用的導入,沒有未使用的變量,即使在解包記錄等時),或者擺脫-Wall和tu只有你認爲重要的警告。