Jog*_*ger 6 haskell quickcheck
如何使用检查器库来测试简单解析器的Functor定律?
import Test.QuickCheck
import Test.QuickCheck.Checkers
import Test.QuickCheck.Classes
import qualified Data.ByteString as BS
type Index = Int
newtype Parser a = Parser (BS.ByteString -> Index -> (a, Index))
runParser :: Parser a -> BS.ByteString -> Index -> (a, Index)
runParser (Parser p) = p
instance Functor Parser where
f `fmap` p = Parser $ \bs i ->
let (a, ix) = runParser p bs i
in (f a, ix)
Run Code Online (Sandbox Code Playgroud)
我想我必须使用Test.QuickCheck.Classes中的仿函数函数
类型是:
functor :: forall m a b c. (Functor m, Arbitrary a, Arbitrary b, Arbitrary c,
CoArbitrary a, CoArbitrary b, Show (m a), Arbitrary (m a), EqProp (m a), EqProp (m c))
=> m (a, b, c) -> TestBatch
Run Code Online (Sandbox Code Playgroud)
现在米也许应该是我的仿函数解析器,所以我需要像
main :: IO ()
main = = quickBatch (functor (Parser (a, b, c))
Run Code Online (Sandbox Code Playgroud)
但是我用(a, b, c)什么呢?
注意:我知道快速QuickTest测试不是证据,我已经阅读了如何使用检查器测试这个应用实例的讨论 ?(没有CoArbitrary的实例(验证e0 [Char])).但是,如果快速测试失败,我知道我的Functor实例已损坏...
编辑
我取得了一些进展:我可以写
main :: IO ()
main = quickBatch $ functor (undefined :: Parser (Int, String, Char))
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:没有实例(Show(Parser Int))
在仿函数的类型签名中,没有提到的Read实例,所以我可以写
instance Show (Parser a) where
show (Parser a) = "Parsers cannot be printed"
Run Code Online (Sandbox Code Playgroud)
这给出了一个新的错误:
• No instance for (Arbitrary (Parser Int))
arising from a use of ‘functor’
• In the second argument of ‘($)’, namely
Run Code Online (Sandbox Code Playgroud)
我想这是一个更棘手的问题......
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |