Skip to content

Instantly share code, notes, and snippets.

@fero23
Created September 30, 2016 03:09
Show Gist options
  • Save fero23/2cdb7bd2cfdee5b8c8f0a412323bf433 to your computer and use it in GitHub Desktop.
Save fero23/2cdb7bd2cfdee5b8c8f0a412323bf433 to your computer and use it in GitHub Desktop.
Haskell triangle calculation
data Side = Adjacent Double | Opposite Double | Hypotenuse Double deriving Show
type Angles = Maybe (Double, Double, Double)
type Sides = Maybe (Double, Double, Double)
data Triangle = Triangle Angles Sides
toDegrees :: Double -> Double
toDegrees rad = rad * 360 / (2 * pi)
toRadian :: Double -> Double
toRadian deg = deg * 2 * pi / 360
instance Show Triangle where
show (Triangle (Just (a1, a2, a3)) (Just (s1, s2, s3))) =
"Angles: "
++ show (round $ toDegrees a1)
++ ", " ++ show (round $ toDegrees a2)
++ ", " ++ show (round $ toDegrees a3)
++ "\nSides: "
++ show s1
++ ", " ++ show s2
++ ", " ++ show s3
calcTriangle :: Double -> Side -> Triangle
calcTriangle angle side = loop $ Triangle Nothing Nothing
where
a1 = toRadian angle
loop triangle = case triangle of
(Triangle _ sides@(Just (adj, op, hyp))) ->
let a2 = acos (op / hyp) in
Triangle (Just (a1, a2, pi - a1 - a2)) sides
(Triangle _ _) -> case side of
(Adjacent side) ->
loop . Triangle Nothing $ Just (side, tan a1 * side, side / cos a1)
(Opposite side) ->
loop . Triangle Nothing $ Just (side / tan a1, side, side / sin a1)
(Hypotenuse side) ->
loop . Triangle Nothing $ Just (cos a1 * side, sin a1 * side, side)
{-
*Main> putStrLn . show $ calcTriangle 60 (Hypotenuse 2)
Angles: 60, 30, 90
Sides: 1.0000000000000002, 1.7320508075688772, 2.0
-}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment