Test integerness: Difference between revisions
Content added Content deleted
(take it out of draft status) |
(→{{header|Haskell}}: Added Haskell solution) |
||
Line 636: | Line 636: | ||
<…> true *main.customIntegerType |
<…> true *main.customIntegerType |
||
</pre> |
</pre> |
||
=={{header|Haskell}}== |
|||
Some imports for additional number types |
|||
<lang haskell>import Data.Decimal |
|||
import Data.Ratio |
|||
import Data.Complex</lang> |
|||
Haskell is statically typed, so in order to get universal integerness test we define a class of numbers, which may contain integers: |
|||
<lang haskell>class ContainsInteger a where |
|||
isInteger :: a -> Bool</lang> |
|||
Here are some instances: |
|||
Integral numbers: |
|||
<lang haskell>instance ContainsInteger Int where isInteger _ = True |
|||
instance ContainsInteger Integer where isInteger _ = True</lang> |
|||
Real fractional numbers: |
|||
<lang haskell>isIntegerF :: (Eq x, RealFrac x) => x -> Bool |
|||
isIntegerF x = x == fromInteger (truncate x) |
|||
instance ContainsInteger Double where isInteger = isIntegerF |
|||
instance Integral i => ContainsInteger (DecimalRaw i) where isInteger = isIntegerF |
|||
instance Integral i => ContainsInteger (Ratio i) where isInteger = isIntegerF</lang> |
|||
Complex numbers: |
|||
<lang haskell>instance (Eq a, Num a, ContainsInteger a) => ContainsInteger (Complex a) where |
|||
isInteger z = isInteger (realPart z) && (imagPart z == 0)</lang> |
|||
'''Extra credit''' |
|||
Approximate integerness for fractional numbers: |
|||
<lang haskell>x ~~ eps = abs x <= eps |
|||
almostInteger :: RealFrac a => a -> a -> Bool |
|||
almostInteger eps x = (x - fromInteger (round x)) ~~ eps |
|||
almostIntegerC :: RealFrac a => a -> Complex a -> Bool |
|||
almostIntegerC eps z = almostInteger eps (realPart z) && (imagPart z) ~~ eps</lang> |
|||
'''Testing''' |
|||
<lang haskell>tests = all (== True) |
|||
[ isInteger (5 :: Integer) |
|||
, isInteger (5.0 :: Decimal) |
|||
, isInteger (-5 :: Integer) |
|||
, isInteger (0 :: Decimal) |
|||
, isInteger (-2.1e120 :: Double) |
|||
, isInteger (5 % 1 :: Rational) |
|||
, isInteger (4 % 2 :: Rational) |
|||
, isInteger (5 :+ 0 :: Complex Integer) |
|||
, isInteger (5.0 :+ 0.0 :: Complex Decimal) |
|||
, isInteger (6 % 3 :+ 0 :: Complex Rational) |
|||
, isInteger (1/0 :: Double) -- Infinity is integer |
|||
, isInteger (1.1/0 :: Double) -- Infinity is integer |
|||
, not $ isInteger (5.01 :: Decimal) |
|||
, not $ isInteger (-5e-2 :: Double) |
|||
, not $ isInteger (5 % 3 :: Rational) |
|||
, not $ isInteger (5 :+ 1 :: Complex Integer) |
|||
, not $ isInteger (6 % 4 :+ 0 :: Complex Rational) |
|||
, not $ isInteger (5.0 :+ 1.0 :: Complex Decimal) |
|||
, almostInteger 0.01 2.001 |
|||
, almostInteger 0.01 (-1.999999) |
|||
, almostInteger (1 % 10) (24 % 23) |
|||
, not $ almostInteger 0.01 2.02 |
|||
, almostIntegerC 0.001 (5.999999 :+ 0.000001) |
|||
]</lang> |
|||
'''Possible use''' |
|||
Effective definition of Pithagorean triangles: |
|||
<lang haskell>pithagoreanTriangles :: [[Integer]] |
|||
pithagoreanTriangles = |
|||
[ [a, b, round c] | b <- [1..] |
|||
, a <- [1..b] |
|||
, let c = sqrt (fromInteger (a^2 + b^2)) |
|||
, isInteger (c :: Double) ]</lang> |
|||
<pre>λ> take 7 pithagoreanTriangles |
|||
[[3,4,5],[6,8,10],[5,12,13],[9,12,15],[8,15,17],[12,16,20],[15,20,25]] |
|||
λ> pithagoreanTriangles !! 1000 |
|||
[726,968,1210] |
|||
λ> head $ filter ((> 1000). sum) pithagoreanTriangles |
|||
[297,304,425]</pre> |
|||
=={{header|J}}== |
=={{header|J}}== |
||
Line 642: | Line 728: | ||
'''Example''':<lang j> isInt 3.14 7 1.4j0 4j0 5j3 |
'''Example''':<lang j> isInt 3.14 7 1.4j0 4j0 5j3 |
||
0 1 0 1 0</lang> |
0 1 0 1 0</lang> |
||
=={{header|jq}}== |
=={{header|jq}}== |
||
{{works with|jq|1.4}} |
{{works with|jq|1.4}} |