I'm using QuickCheck to generate arbitrary functions, and I'd like to generate arbitrary injective functions (i.e. f a == f b
if and only if a == b
).
I thought I had it figured out:
newtype Injective = Injective (Fun Word Char) deriving Show
instance Arbitrary Injective where
arbitrary = fmap Injective fun
where
fun :: Gen (Fun Word Char)
fun = do
a <- arbitrary
b <- arbitrary
arbitrary `suchThat` \(Fn f) ->
(f a /= f b) || (a == b)
But I'm seeing cases where the generated function maps distinct inputs to the same output.
What I want:
- f such that for all inputs a and b, either f a does not equal f b or a equals b.
What I think I have:
- f such that there exist inputs a and b where either f a does not equal f b or a equals b.
How can I fix this?
Aucun commentaire:
Enregistrer un commentaire