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 № 1Dzię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)