<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Hi Olaf,</p>
    <p>You might like quickcheck-higherorder, "A QuickCheck extension
      for properties of higher-order values."</p>
    <p><a class="moz-txt-link-freetext" href="https://hackage.haskell.org/package/quickcheck-higherorder">https://hackage.haskell.org/package/quickcheck-higherorder</a><br>
    </p>
    <p>One of the key bits is a class for testable equality, which may
      have an instance for (a -> b), unlike Eq:<br>
    </p>
    <pre><code class="language-haskell">class TestEq a where
  (=?) :: a -> a -> Property
</code><code class="language-haskell"></code></pre>
    <p>The package has more bells and whistles to further streamline
      writing properties that quantify over functions.</p>
    <p>If you only ever compare unary first-order functions, you really
      only need the single instance TestEq (a -> b), which you can
      extract as a self-contained operator:</p>
    <p>(=?) :: (Coarbitrary a, Show a, Arbitrary b, Eq b, Show b) =>
      (a -> b) -> (a -> b) -> Property<br>
      (=?) f g = property $ \x -> f x === g x<br>
    </p>
    Regards,<br>
    Li-yao<br>
    <pre><code class="language-haskell"></code></pre>
    <p></p>
    <div class="moz-cite-prefix">On 2023-05-31 12:25 PM, Olaf Klinke
      wrote:<br>
    </div>
    <div class="replaced-blockquote"
cite="mid:0626487deb20283260693c580cc8871a684d530b.camel@aatal-apotheke.de"
      type="cite">
      <pre class="moz-quote-pre" wrap="">Dear Cafe,

The expression

\x -> f x == g x

is a testable property, as long as values for x can be randomly
generated. For clarity I'd prefer a point-free style, e.g. 

f ≡ g

Are there extensions to QuickCheck that let me write this? The
QuickCheck package itself does not seem to contain such an operator. My
current work-around is a 
    newtype ExtensionalEquality a b 
that holds two functions of type (a -> b) and a Testable instance for
it. But I've got a hunch that I re-invented some wheel here. (My
ExtensionalEquality is isomorphic to 
    Refl (a -> b) (a -> b)
but Refl ist conceptually about type equality, not term equality.)

Thanks
Olaf

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
Only members subscribed via the mailman list are allowed to post.</pre>
    </div>
  </body>
</html>