On 2014-11-13 at 23:20:47 +0100, Mario Blažević wrote: [...]
Regarding the partial vs. saturated negation, I'm in favour of the former. However, there is another option nobody mentioned so far: NaN. I.e.,
1 - 2 = NaN 3 + 1 - 2 = 2 3 + (1 - 2) = NaN
Could a GMP-based implementation provide such semantics without too much performance loss? If so, this would be my preference.
Purely from a technical point of view: If you look at how it's implemented right now: https://phabricator.haskell.org/D473 being able to represent a 'not-a-natural' would be possible for the GMP2-backed 'Natural' by adding a 'NatErr#' constructor, i.e. data Natural = NatS# Word# | NatJ# {-# UNPACK #-} !BigNat | NatErr# deriving (Eq,Ord) that, however, would require to add one or two case-distinction to all 'Natural' operations, and we probably shouldn't auto-derive 'Eq'/'Ord' anymore (as it's no longer to be considered a properly ordered set/equivalence relation with that absorbing NatErr# element) However, also the fallback implementation (for when GHC is configured with a the old integer-gmp or the integer-simple backend) which is newtype Natural = Natural Integer would need to become more complex, as the lightweight newtype would be turned into something like data Natural = Natural !Integer | NaturalErr So I'm afraid handling not-a-natural would indeed come at a cost. Cheers, hvr