我想通過99 Haskell Problems,我想專注於解決方案,但需要測試。如果我有解決的第一個問題是一個3線.hs
文件,簡單的haskell單元測試
myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
什麼是我可以添加到這個,這樣我可以在線添加試驗和runhaskell
運行他們的代碼量最小?
我想通過99 Haskell Problems,我想專注於解決方案,但需要測試。如果我有解決的第一個問題是一個3線.hs
文件,簡單的haskell單元測試
myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
什麼是我可以添加到這個,這樣我可以在線添加試驗和runhaskell
運行他們的代碼量最小?
QuickCheck(它基本上爲您生成測試輸入)可能是測試純函數的最佳方法。如果有問題的功能有一個模擬標準庫中,你可以使用一個標準的模型只是測試你的函數:
{-# LANGUAGE TemplateHaskell #-}
import Test.QuickCheck
import Test.QuickCheck.All
myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
-- here we specify that 'myLast' should return exactly the same result
-- as 'last' for any given 'xs'
prop_myLast xs = myLast xs == last xs
return [] -- need this for GHC 7.8
-- quickCheckAll generates test cases for all 'prop_*' properties
main = $(quickCheckAll)
如果你運行它,你會得到:
=== prop_myLast on tmp3.hs:12 ===
*** Failed! Exception: 'tmp3.hs:(7,1)-(8,25): Non-exhaustive patterns in function myLast' (after 1 test):
[]
False
因爲你的myLast
不處理[]
的情況(它應該但應該可能會拋出像'最後'的錯誤)。 但在這裏我們可以簡單地調整我們的測試,但規定只有非空字符串,應使用(使用==>
組合子):
prop_myLast xs = length xs > 0 ==> myLast xs == last xs
這讓所有100自動生成測試用例以通爲myLast
:
=== prop_myLast on tmp3.hs:11 ===
+++ OK, passed 100 tests.
True
PS指定myLast
行爲的另一種方式可能是:
prop_myLast2 x xs = myLast (xs++[x]) == x
或者貝特R:
prop_myLast3 x xs = x `notElem` xs ==> myLast (xs++[x]) == x
hspec也是Haskell中,這是由紅寶石RSpec的啓發測試框架。它與QuickCheck,SmallCheck和HUnit集成在一起。
當我用'runhaskell lists.hs'運行我的文件時,它給了我「lists.hs:44:8:輸入'$'上的解析錯誤」這是我應該如何運行它的? https://gist.github.com/923814 – 2011-04-17 07:05:03
嘗試添加'{ - #LANGUAGE TemplateHaskell# - }'按照我的示例。如果你的'runhaskell'指向'runghc',這應該可以做到。同時將'prop_last''重命名爲'prop_last' - 否則QuickCheck似乎忽略它。 – 2011-04-17 07:45:37
所以,所有的作品(謝謝!),但現在我該如何讓quickcheck捕獲錯誤?我添加了'最後一個'[] =錯誤「空列表」' – 2011-04-18 02:33:29