symdiff做了什么(在haskell中)

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'

And*_*ewC 6

提示在小测试中:

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
之间的差异
来帮助你.

(您可以简化为更少的案例,但从这四个案例开始.)

现在考虑一下,如果这不足以暗示一个好的想法,评论.