Test integerness: Difference between revisions

→‎{{header|Haskell}}: Added Haskell solution
(take it out of draft status)
(→‎{{header|Haskell}}: Added Haskell solution)
Line 636:
<…> true *main.customIntegerType
</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}}==
Line 642 ⟶ 728:
'''Example''':<lang j> isInt 3.14 7 1.4j0 4j0 5j3
0 1 0 1 0</lang>
 
=={{header|jq}}==
{{works with|jq|1.4}}
Anonymous user