Added exponentation operator for numerical types. #1084
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
An exponentation operation
x ^ n
is added for all types implementingNum
and natural numbersn
. In particular, this fixes issue #592.Remarks regarding the implementation
The operator
(^)
is right-associative, following mathematicalconventions, with precedence level
10
.It is implemented using repeating squaring. This is reasonably fast, e.g. computing
2 ^ 2 ^ 2 ^ 2 ^ 2
takes under 10 seconds.Justification for the draft PR
Currently, there is no exponentation operator defined (for any of the numerical types), even though there is a power function for natural numbers. This power function is very slow however.
Problems with this draft
Even though this operator makes sense for any numerical type, it is defined in the module
Data.Nat.Views
, which seems a rather odd place. However, I couldn't place it inPrelude.Num
because it uses the recursive half-view for natural numbers, and even if it wasn't, it would still result in a circular module dependency asPrelude.Num
is imported inPrelude.Types
(whereNat
is defined).I therefore welcome any suggestions for a better placement.