2013-05-22 66 views
7

如果我沒記錯的學校,還有一個用於函數或關鍵字「尚未實現。」但代碼編譯。我試圖搜索它,但找不到。任何人都知道我在找什麼?「不操作」哈斯克爾

是的類似

isDivisor :: Integer -> Integer -> Bool 
isDivisor x y = None 
--isDivisor x y = (rem x y) == 0 
+1

使用'undefined'。當你調用這個函數時,你會得到'*** Exception:Prelude.undefined'。 –

+1

或者,'isDivisor x y = error「Not yet implemented」',或者,如果你想ghci循環,'isDivisor x y = isDivisor x y'。 –

回答

8

你在想什麼的被稱爲bottom

底部不只是爲顯示未實現的東西,它的意思表示這會導致我們的程序的計算失敗。

例如,我們可以實際上定義undefined自己作爲一個無限循環

undefined = let x = x in x 
undefined = undefined 

因此,其實我們現在所做的只是一個值undefined :: a投入,這將導致或程序永遠崩潰或環路,但從來沒有評估它。

因此,如果你有一些大而複雜的功能,你不知道如何實現,你可能只是這樣做

foo :: Bar -> Baz -> Quux 
foo bar baz = foo bar baz 

由於這typechecks,它會編譯和我們可以測試的其他部分我們程序。

但是,由於當您意外地運行該程序的這一部分時,如果出現無限循環是相當無益的,GHC和其他人以不同方式實現undefined。他們有他們程序崩潰,併發出一個錯誤信息,如:

-- In GHC 
error msg = throw (ErrorCall s) 
undefined = error "Prelude.undefined" 

所以留下更好的調試能力

foo bar baz = undefined 
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz) 

如果您發現底部混亂,哈馬爾的概念未定義功能貼有很大answer