我目前正在使用 Haskell 中的 ADT 并尝试构建 ADT Figure
:
data Figure = Rect { x :: Integer, y :: Integer, width :: Integer, height :: Integer}
| Circle { x :: Integer, y :: Integer, radius :: Integer}
| CombiFigure Figure Figure
deriving (Eq, Show, Read)
现在我遇到了一个问题,如何实现一个不应该接受每一个Figure
,但例如只接受一个Circle
.
我已经有一个糟糕的设计吗?还是有一些最佳实践如何做到这一点?
例如,考虑一个直径函数。我想到的所有(我是 Haskell 的初学者)都是以下两个选项,使用undefined
or Maybe
:
1:
diameter :: Figure -> Integer
diameter (Circle _ _ r) = 2 * r
diameter _ = undefined
2:
diameter :: Figure -> Maybe Integer
diameter (Circle _ _ r) = Just (2 * r)
diameter _ = Nothing
有没有更可取的方法来实现这一目标?谢谢!