Export functions on Natural in Numeric.Natural

Functions in GHC.Natural like naturalToWordMaybe and minusNaturalMaybe are extremely useful, especially when trying to write provably total functions, and I wish they were available in a Safe module like Numeric.Natural. I also want a total function that does the following: -- This function turns an Integer n into a pair of -- (fromInteger (abs n), fromInteger (signum n)). integerToNaturalSign :: Integer -> (Natural, Int) #if 0 -- This is the reference version, except for the fact that numeric literals don't exist yet -- when GHC.Natural is being defined, and fromInteger isn't actually total. integerToNaturalSign n = case compare n 0 of LT -> (fromInteger (negate n), -1) EQ -> (0, 0) GT -> (fromInteger n, 1) #elif !defined(MIN_VERSION_integer_gmp) -- This is like the reference version, except using the newtype wrapper and MagicHash. integerToNaturalSign n = case compare n (intToInteger# 0#) of LT -> (Natural (negateInteger n), I# (-1#)) EQ -> (Natural n, I# 0#) GT -> (Natural n, I# 1#) #else -- We take advantage of the GMP functions and constructors. integerToNaturalSign (Jn# bn) = (bigNatToNatural bn, I# (-1#)) integerToNaturalSign (S# i#) = case isTrue# (i# <# 0#) of True -> (NatS# (int2Word# (negateInt# i#)), I# (-1#)) _ -> (NatS# (int2Word# i#), I# (i# ># 0#)) integerToNaturalSign (Jp# bn) = (bigNatToNatural bn, I# 1#) #endif

Sure, I don't see why not. I think powModNatural is also safe.
Are your criteria for a function worth re-exporting from Numeric.Natural that
1. The function does not have an overloaded variant defined in base
(e.g. all the monorphic version of `fromIntegral` in GHC.Natural would
be excluded) and
2. The function is total?
Thanks
On Sun, Mar 22, 2020 at 11:40 AM Zemyla
Functions in GHC.Natural like naturalToWordMaybe and minusNaturalMaybe are extremely useful, especially when trying to write provably total functions, and I wish they were available in a Safe module like Numeric.Natural. I also want a total function that does the following:
-- This function turns an Integer n into a pair of -- (fromInteger (abs n), fromInteger (signum n)). integerToNaturalSign :: Integer -> (Natural, Int) #if 0 -- This is the reference version, except for the fact that numeric literals don't exist yet -- when GHC.Natural is being defined, and fromInteger isn't actually total. integerToNaturalSign n = case compare n 0 of LT -> (fromInteger (negate n), -1) EQ -> (0, 0) GT -> (fromInteger n, 1) #elif !defined(MIN_VERSION_integer_gmp) -- This is like the reference version, except using the newtype wrapper and MagicHash. integerToNaturalSign n = case compare n (intToInteger# 0#) of LT -> (Natural (negateInteger n), I# (-1#)) EQ -> (Natural n, I# 0#) GT -> (Natural n, I# 1#) #else -- We take advantage of the GMP functions and constructors. integerToNaturalSign (Jn# bn) = (bigNatToNatural bn, I# (-1#)) integerToNaturalSign (S# i#) = case isTrue# (i# <# 0#) of True -> (NatS# (int2Word# (negateInt# i#)), I# (-1#)) _ -> (NatS# (int2Word# i#), I# (i# ># 0#)) integerToNaturalSign (Jp# bn) = (bigNatToNatural bn, I# 1#) #endif _______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

That pretty much sums it up.
On Sun, Mar 22, 2020, 17:55 chessai .
Sure, I don't see why not. I think powModNatural is also safe.
Are your criteria for a function worth re-exporting from Numeric.Natural that
1. The function does not have an overloaded variant defined in base (e.g. all the monorphic version of `fromIntegral` in GHC.Natural would be excluded) and 2. The function is total?
Thanks
On Sun, Mar 22, 2020 at 11:40 AM Zemyla
wrote: Functions in GHC.Natural like naturalToWordMaybe and minusNaturalMaybe
are extremely useful, especially when trying to write provably total functions, and I wish they were available in a Safe module like Numeric.Natural. I also want a total function that does the following:
-- This function turns an Integer n into a pair of -- (fromInteger (abs n), fromInteger (signum n)). integerToNaturalSign :: Integer -> (Natural, Int) #if 0 -- This is the reference version, except for the fact that numeric
literals don't exist yet
-- when GHC.Natural is being defined, and fromInteger isn't actually total. integerToNaturalSign n = case compare n 0 of LT -> (fromInteger (negate n), -1) EQ -> (0, 0) GT -> (fromInteger n, 1) #elif !defined(MIN_VERSION_integer_gmp) -- This is like the reference version, except using the newtype wrapper and MagicHash. integerToNaturalSign n = case compare n (intToInteger# 0#) of LT -> (Natural (negateInteger n), I# (-1#)) EQ -> (Natural n, I# 0#) GT -> (Natural n, I# 1#) #else -- We take advantage of the GMP functions and constructors. integerToNaturalSign (Jn# bn) = (bigNatToNatural bn, I# (-1#)) integerToNaturalSign (S# i#) = case isTrue# (i# <# 0#) of True -> (NatS# (int2Word# (negateInt# i#)), I# (-1#)) _ -> (NatS# (int2Word# i#), I# (i# ># 0#)) integerToNaturalSign (Jp# bn) = (bigNatToNatural bn, I# 1#) #endif _______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries

Sounds reasonable to me. Perhaps others can weigh in.
Thanks
On Sun, Mar 22, 2020, 6:11 PM Zemyla
That pretty much sums it up.
On Sun, Mar 22, 2020, 17:55 chessai .
wrote: Sure, I don't see why not. I think powModNatural is also safe.
Are your criteria for a function worth re-exporting from Numeric.Natural that
1. The function does not have an overloaded variant defined in base (e.g. all the monorphic version of `fromIntegral` in GHC.Natural would be excluded) and 2. The function is total?
Thanks
On Sun, Mar 22, 2020 at 11:40 AM Zemyla
wrote: Functions in GHC.Natural like naturalToWordMaybe and minusNaturalMaybe
are extremely useful, especially when trying to write provably total functions, and I wish they were available in a Safe module like Numeric.Natural. I also want a total function that does the following:
-- This function turns an Integer n into a pair of -- (fromInteger (abs n), fromInteger (signum n)). integerToNaturalSign :: Integer -> (Natural, Int) #if 0 -- This is the reference version, except for the fact that numeric
literals don't exist yet
-- when GHC.Natural is being defined, and fromInteger isn't actually total. integerToNaturalSign n = case compare n 0 of LT -> (fromInteger (negate n), -1) EQ -> (0, 0) GT -> (fromInteger n, 1) #elif !defined(MIN_VERSION_integer_gmp) -- This is like the reference version, except using the newtype wrapper and MagicHash. integerToNaturalSign n = case compare n (intToInteger# 0#) of LT -> (Natural (negateInteger n), I# (-1#)) EQ -> (Natural n, I# 0#) GT -> (Natural n, I# 1#) #else -- We take advantage of the GMP functions and constructors. integerToNaturalSign (Jn# bn) = (bigNatToNatural bn, I# (-1#)) integerToNaturalSign (S# i#) = case isTrue# (i# <# 0#) of True -> (NatS# (int2Word# (negateInt# i#)), I# (-1#)) _ -> (NatS# (int2Word# i#), I# (i# ># 0#)) integerToNaturalSign (Jp# bn) = (bigNatToNatural bn, I# 1#) #endif _______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
participants (2)
-
chessai .
-
Zemyla