2010-04-29 44 views
3

有沒有辦法讓GHCi產生更好的異常消息,當它在運行時發現一個調用產生了與函數的模式匹配不匹配的值?更好的例外情況下,非窮舉模式

它目前給出了產生非窮舉模式匹配的函數的行號,雖然有時需要進行一輪調試,但有時我覺得它們會一遍又一遍地做同樣的事情。所以在我嘗試整理一個解決方案之前,我想看看是否還有別的東西存在。

一個異常消息,除了給出行號外,還顯示它試圖創建什麼樣的調用?

這甚至可能嗎?

回答

9

嘗試打開ghci中的警告。例如,這可以通過傳遞-W來啓用ghc編譯時的警告。您可以通過以下幾種方式進行:

ghci -fwarn-incomplete-patterns 

Neil Mitchell describes how he sets this up in his .ghci。下面是相關的摘錄:

:set -fwarn-incomplete-patterns 

您可以手動在ghci中輸入這個爲好,但它會是一個痛苦每次啓動時間這樣做。以這種方式輸入,它僅適用於在提示符處輸入的語句,而不適用於使用:l加載文件。相反,你可以在文件的頂部把這個意見要警告不完整的模式:

{-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 
+1

可悲的是,這並不總是警告,據我所知...我只是試過了,沒有運氣,謝謝反正! – toofarsideways 2010-04-29 13:49:01

+1

顯然這隻適用於在ghc中鍵入的語句,而不是從文件加載。我更新了我的答案,也爲此工作。 – 2010-04-29 15:41:58

+0

謝謝,正是我需要的! – toofarsideways 2010-04-29 16:33:49

2

我認識到這是一個不回答你的問題的東西,但我的印象是老將哈斯克爾間程序員普遍認爲,首先應該避免使用非窮舉模式,即使使用-Werror來生成錯誤而不僅僅是警告。

但是我不確定GHCi和GHCi的結合程度如何,特別是如果你在提示符下編寫函數而不是加載文件時 - 我可以想象它的方法不僅僅是幫助互動工作。儘管如此,使用適當的命令行標誌運行GHCi對我來說似乎也能得到理想的結果。

如果您想對非窮舉模式採取更激烈的解決方案,您可以隨時使用Catch以使用現代GHC版本。嘿。

除此之外,如果您使用的是非窮舉模式,因爲函數確實不應該使用某些值調用,那麼可以使用類似error $ "function foo called with ridiculous arguments " ++ show blahBlah的方式填充丟失的例子,如果知道無效參數是很有幫助。或者,您可以嘗試重寫您的代碼或定義更專用的數據類型,以便函數始終可以對任何非底層參數進行合理處理。

否則,我認爲你會陷入尷尬的調試。

+0

這是一個很好的觀點,因爲目前我懷疑我可以遵循這個規則,但是我很快就要進行一次重構會議,所以將這個問題轉化並修復出現的所有問題很快就會出現在這個列表中。感謝你的演出提示,我不知道你可以用這種方式構造一個錯誤。我很痛惜有一些有用的錯誤,因爲我沒有看到使用這種風格。除了在錯誤的方向上拋出錯誤「在foo函數中拋棄」 – toofarsideways 2010-04-29 16:37:37

+0

@toofarsideways:'error'只是一個函數,它爲錯誤信息提供了一個任意的'String';你可以做任何你想要創建的字符串。如果您還沒有,可能還想查看'Debug.Trace'模塊,以獲得舊式「printf調試」的快速和骯髒的Haskell版本。就使用'error'而言,它可能是生產代碼的不良風格,但對於開發/測試來說很好。 – 2010-04-29 16:55:07

+0

謝謝,值得一看:)。我一直在撓頭如何做到這一點...... – toofarsideways 2010-04-29 17:36:35