/ / Jak przekonwertować wynik mnożenia liczby całkowitej * na liczbę podwójną? - haskell, konwersja typów, typy, algebraiczne typy danych

Jak przekonwertować wynik liczby całkowitej Integer * Integer na Double? - haskell, konwersja typu, typeclass, typy danych algebraicznych

Właśnie uczę się Haskell i chcę opracować swój pierwszy rekursywny ADT.

Mój typ danych Figure powinien być w stanie reprezentować dowolne kombinacje prostokątów i okręgów oraz metodę area powinien obliczyć całkowity obszar postaci (ignorując nakładanie się).

Problem polega na tym, że np. prostokąty, szerokość i wysokość to Integer, podczas gdy wynikiem obszaru powinno być Double (lub przynajmniej liczba zmiennoprzecinkowa).

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
| Circle { x :: Integer, y :: Integer, radius :: Integer}
| CombiFigure Figure Figure
deriving (Eq, Read, Show)

area :: Figure -> Double
area (Rect _ _ w h) = (w * h) -- Integer * Integer, does not work
area (Circle _ _ r) = (pi * r * r) -- (Floating a => a) * Integer * Integer, does not work
area (CombiFigure first second) = (area first) + (area second) -- Double * Double, works

Czy możesz mi wskazać, jak to rozwiązać? Wynik nie jest obowiązkowy Double, ale pewna liczba zmiennoprzecinkowa do obliczenia powierzchni okręgu.

Odpowiedzi:

0 dla odpowiedzi № 1

Dzięki komentarzowi @ Jean-Baptiste Yunés udało mi się to rozwiązać za pomocą fromIntegral i fromInteger uznany tutaj:

data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
| Circle { x :: Integer, y :: Integer, radius :: Integer}
| CombiFigure Figure Figure
deriving (Eq, Read, Show)

area :: Figure -> Double
area (Rect _ _ w h) = (fromIntegral w * fromIntegral h) -- Method 1: using fromIntegral
area (Circle _ _ r) = (pi * fromInteger r * fromInteger r) -- Method 2: using fromInteger
area (CombiFigure first second) = (area first) + (area second)