Pet*_*ter 1 haskell smallcheck
我应该填写一些东西,undefined以便编译程序并测试它.我真的不知道symdiff应该做什么,所以我不知道我能填写什么undefined.有人可以给我一个提示,我可以插入undefined什么?
顺便说一句,当我想用ghci 7.6.3编译代码时,我得到一个错误:
Could not find module 'Test.SmallCheck.Series'我该如何解决?
这是代码:
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language NoMonomorphismRestriction #-}
module Blueprint where
import Test.SmallCheck
import Test.SmallCheck.Series
data N = Z | S N deriving (Show , Eq)
symdiff :: N -> N -> N
symdiff x y = undefined
-- for testing in ghci: smallCheck 10 spec1
spec1 = \ (x,y) -> symdiff x y == symdiff y x
spec2 = \ (x,y) -> symdiff x (plus x y) == y
plus :: N -> N -> N
plus x y = case x of
Z -> y
S x' -> S (plus x' y)
test :: Bool
test = and
[ null $ failures 10 1000 $ spec1
, null $ failures 10 1000 $ spec2
]
instance Monad m => Serial m N where series = cons0 Z \/ cons1 S
-- | first f failures from t testcases for property p
failures f t p = take f
$ filter ( \ x -> not $ p x )
$ take t
$ do d <- [ 0 .. ] ; list d series
Run Code Online (Sandbox Code Playgroud)
谢谢,这帮了很多忙!那这个呢:
symdiff :: N -> N -> N
symdiff x y = case x of
Z -> y
S x' -> case y of
Z -> x
S y' -> ???
Run Code Online (Sandbox Code Playgroud)
这些行是否正确(除了???的行,我已经考虑过了)
这适用于最后一行:
S y' -> symdiff x' y'
提示在小测试中:
spec1 = \ (x,y) -> symdiff x y == symdiff y x
spec2 = \ (x,y) -> symdiff x (plus x y) == y
Run Code Online (Sandbox Code Playgroud)
这意味着symdiff需要满足这两个方程
symdiff x y == symdiff y x -- shouldn't matter what order (symmetric?)
symdiff x (plus x y) == y -- if they differ by y, that's the answer (difference)
Run Code Online (Sandbox Code Playgroud)
这意味着symdiff必须找到两个参数之间的差异.
您需要将其Z视为零和S x继承者x,即x+1.
好消息是,只有两种可能性N,因此最多四种方程式symdiff:
symdiff Z Z =
symdiff Z (S y) =
symdiff (S x) Z =
symdiff (S x) (S y) =
Run Code Online (Sandbox Code Playgroud)
想想你如何找到
0和0
0和1 + y
1 + x和0
1 + x和1 + y之间的差异
来帮助你.
(您可以简化为更少的案例,但从这四个案例开始.)
现在考虑一下,如果这不足以暗示一个好的想法,评论.