    {-# LANGUAGE ScopedTypeVariables #-}

    {-# OPTIONS_GHC -Wall #-}

    module Test.QuickCheck.Classes.Num
      ( numLaws
      ) where

    import Data.Proxy (Proxy)
    import Test.QuickCheck hiding ((.&.))
    import Test.QuickCheck.Property (Property)

    import Test.QuickCheck.Classes.Internal (Laws(..), myForAllShrink)

    -- | Tests the following properties:
    --
    -- [/Additive Commutativity/]
    --   @a + b ≡ b + a@
    -- [/Additive Left Identity/]
    --   @0 + a ≡ a@
    -- [/Additive Right Identity/]
    --   @a + 0 ≡ a@
    -- [/Multiplicative Associativity/]
    --   @a * (b * c) ≡ (a * b) * c@
    -- [/Multiplicative Left Identity/]
    --   @1 * a ≡ a@
    -- [/Multiplicative Right Identity/]
    --   @a * 1 ≡ a@
    -- [/Multiplication Left Distributes Over Addition/]
    --   @a * (b + c) ≡ (a * b) + (a * c)@
    -- [/Multiplication Right Distributes Over Addition/]
    --   @(a + b) * c ≡ (a * c) + (b * c)@
    -- [/Multiplicative Left Annihilation/]
    --   @0 * a ≡ 0@
    -- [/Multiplicative Right Annihilation/]
    --   @a * 0 ≡ 0@
    -- [/Additive Inverse/]
    --   @'negate' a '+' a ≡ 0@
    -- [/Subtraction/]
    --   @a '+' 'negate' b ≡ a '-' b@
    -- [/Abs Is Idempotent/]
    --   @'abs' ('abs' a) ≡ 'abs' a
    -- [/Signum Is Idempotent/]
    --   @'signum' ('signum' a) ≡ 'signum' a
    -- [/Product Of Abs And Signum Is Id/]
    --   @'abs' a * 'signum' a ≡ a@
    numLaws :: (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
    numLaws :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
    numLaws Proxy a
    p = String -> [(String, Property)] -> Laws
    Laws String
    "Num"
      [ (String
    "Additive Commutativity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numCommutativePlus Proxy a
    p)
      , (String
    "Additive Left Identity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityPlus Proxy a
    p)
      , (String
    "Additive Right Identity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityPlus Proxy a
    p)
      , (String
    "Multiplicative Associativity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAssociativeTimes Proxy a
    p)
      , (String
    "Multiplicative Left Identity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityTimes Proxy a
    p)
      , (String
    "Multiplicative Right Identity", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityTimes Proxy a
    p)
      , (String
    "Multiplication Left Distributes Over Addition", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftMultiplicationDistributes Proxy a
    p)
      , (String
    "Multiplication Right Distributes Over Addition", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightMultiplicationDistributes Proxy a
    p)
      , (String
    "Multiplicative Left Annihilation", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftAnnihilation Proxy a
    p)
      , (String
    "Multiplicative Right Annihilation", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightAnnihilation Proxy a
    p)
      , (String
    "Additive Inverse", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAdditiveInverse Proxy a
    p)
      , (String
    "Subtraction", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numSubtraction Proxy a
    p)
      , (String
    "Abs Is Idempotent", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absIdempotence Proxy a
    p)
      , (String
    "Signum Is Idempotent", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    signumIdempotence Proxy a
    p)
      , (String
    "Product Of Abs And Signum Is Id", Proxy a -> Property
    forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absSignumId Proxy a
    p)
      ]

    numLeftMultiplicationDistributes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftMultiplicationDistributes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftMultiplicationDistributes Proxy a
    _ = Bool
    -> ((a, a, a) -> Bool)
    -> ((a, a, a) -> [String])
    -> String
    -> ((a, a, a) -> a)
    -> String
    -> ((a, a, a) -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> (a, a, a) -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a,a
    b,a
    c) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a, String
    "b = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    b, String
    "c = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    c])
      String
    "a * (b + c)"
      (\(a
    a,a
    b,a
    c) -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * (a
    b a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    c))
      String
    "(a * b) + (a * c)"
      (\(a
    a,a
    b,a
    c) -> (a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    b) a -> a -> a
    forall a. Num a => a -> a -> a
    + (a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c))

    numRightMultiplicationDistributes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightMultiplicationDistributes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightMultiplicationDistributes Proxy a
    _ = Bool
    -> ((a, a, a) -> Bool)
    -> ((a, a, a) -> [String])
    -> String
    -> ((a, a, a) -> a)
    -> String
    -> ((a, a, a) -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> (a, a, a) -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a,a
    b,a
    c) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a, String
    "b = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    b, String
    "c = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    c])
      String
    "(a + b) * c"
      (\(a
    a,a
    b,a
    c) -> (a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    b) a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c)
      String
    "(a * c) + (b * c)"
      (\(a
    a,a
    b,a
    c) -> (a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c) a -> a -> a
    forall a. Num a => a -> a -> a
    + (a
    b a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c))

    numLeftIdentityPlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityPlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityPlus Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "0 + a"
      (\a
    a -> a
    0 a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    a)
      String
    "a"
      (\a
    a -> a
    a)

    numRightIdentityPlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityPlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityPlus Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "a + 0"
      (\a
    a -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    0)
      String
    "a"
      (\a
    a -> a
    a)

    numRightIdentityTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightIdentityTimes Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "a * 1"
      (\a
    a -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    1)
      String
    "a"
      (\a
    a -> a
    a)

    numLeftIdentityTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftIdentityTimes Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "1 * a"
      (\a
    a -> a
    1 a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    a)
      String
    "a"
      (\a
    a -> a
    a)

    numLeftAnnihilation :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftAnnihilation :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numLeftAnnihilation Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "0 * a"
      (\a
    a -> a
    0 a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    a)
      String
    "0"
      (\a
    _ -> a
    0)

    numRightAnnihilation :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightAnnihilation :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numRightAnnihilation Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    False (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "a * 0"
      (\a
    a -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    0)
      String
    "0"
      (\a
    _ -> a
    0)

    numCommutativePlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numCommutativePlus :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numCommutativePlus Proxy a
    _ = Bool
    -> ((a, a) -> Bool)
    -> ((a, a) -> [String])
    -> String
    -> ((a, a) -> a)
    -> String
    -> ((a, a) -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> (a, a) -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a,a
    b) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a, String
    "b = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    b])
      String
    "a + b"
      (\(a
    a,a
    b) -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    b)
      String
    "b + a"
      (\(a
    a,a
    b) -> a
    b a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    a)

    numAssociativeTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAssociativeTimes :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAssociativeTimes Proxy a
    _ = Bool
    -> ((a, a, a) -> Bool)
    -> ((a, a, a) -> [String])
    -> String
    -> ((a, a, a) -> a)
    -> String
    -> ((a, a, a) -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> (a, a, a) -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a,a
    b,a
    c) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a, String
    "b = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    b, String
    "c = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    c])
      String
    "a * (b * c)"
      (\(a
    a,a
    b,a
    c) -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * (a
    b a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c))
      String
    "(a * b) * c"
      (\(a
    a,a
    b,a
    c) -> (a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    b) a -> a -> a
    forall a. Num a => a -> a -> a
    * a
    c)

    numAdditiveInverse :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAdditiveInverse :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numAdditiveInverse Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "negate a + a"
      (\a
    a -> (-a
    a) a -> a -> a
    forall a. Num a => a -> a -> a
    + a
    a)
      String
    "0"
      (a -> a -> a
    forall a b. a -> b -> a
    const a
    0)

    numSubtraction :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numSubtraction :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    numSubtraction Proxy a
    _ = Bool
    -> ((a, a) -> Bool)
    -> ((a, a) -> [String])
    -> String
    -> ((a, a) -> a)
    -> String
    -> ((a, a) -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> (a, a) -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a, a
    b :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a, String
    "b = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    b])
      String
    "a + negate b"
      (\(a
    a,a
    b) -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    + a -> a
    forall a. Num a => a -> a
    negate a
    b)
      String
    "a - b"
      (\(a
    a,a
    b) -> a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    - a
    b)

    absIdempotence :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absIdempotence :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absIdempotence Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "abs (abs a)"
      (a -> a
    forall a. Num a => a -> a
    abs (a -> a) -> (a -> a) -> a -> a
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> a
    forall a. Num a => a -> a
    abs)
      String
    "abs a"
      a -> a
    forall a. Num a => a -> a
    abs

    signumIdempotence :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    signumIdempotence :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    signumIdempotence Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "signum (signum a)"
      (a -> a
    forall a. Num a => a -> a
    signum (a -> a) -> (a -> a) -> a -> a
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . a -> a
    forall a. Num a => a -> a
    signum)
      String
    "signum a"
      a -> a
    forall a. Num a => a -> a
    signum

    absSignumId :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absSignumId :: forall a. (Num a, Eq a, Arbitrary a, Show a) => Proxy a -> Property
    absSignumId Proxy a
    _ = Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> a)
    -> String
    -> (a -> a)
    -> Property
    forall a b.
    (Arbitrary a, Show b, Eq b) =>
    Bool
    -> (a -> Bool)
    -> (a -> [String])
    -> String
    -> (a -> b)
    -> String
    -> (a -> b)
    -> Property
    myForAllShrink Bool
    True (Bool -> a -> Bool
    forall a b. a -> b -> a
    const Bool
    True)
      (\(a
    a :: a) -> [String
    "a = " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ a -> String
    forall a. Show a => a -> String
    show a
    a])
      String
    "abs a * signum a"
      (\a
    a -> a -> a
    forall a. Num a => a -> a
    abs a
    a a -> a -> a
    forall a. Num a => a -> a -> a
    * a -> a
    forall a. Num a => a -> a
    signum a
    a)
      String
    "a"
      a -> a
    forall a. a -> a
    id