起初我想调整你的形状类型:
data Shape = Circle {r :: Double}
| Rectangle {l :: Double, w :: Double}
deriving (Show)
现在,让我们我们认为有一点关于你的函数的类型getShapes
,在我看来它应该有两个东西作为输入一个谓词的形状我想回来,两个从我选择的形状,所以
getShapes :: (Shape -> Bool) -> [Shapes] -> [Shapes]
将是一个合理的选择 - 下一步 - hoogle the stuff,我们看到第二个函数(filter
)似乎对我们的任务的合适人选。
getShapes = filter
所以剩下的步骤是建立circle
功能全,通常被称为谓词。
circle :: Shape -> Bool
circle (Circle _) = True
circle _ = False
如果你是新来的Haskell了 - 这里是哈斯克尔最强大的概念之一:模式匹配
circle (Circle _)
检查其参数的类型为Circle
,其中类型是类似的构造以OO语言。 _
被称为我不在乎变数它用于名称适合时。因此,圈子会检查它获得的Shape
是否为Circle
,并且不在乎它所具有的半径,并返回True
- 或者 - 在任何其他情况下返回False
。 这也将工作,如果某些星期后,我决定再添加一个Shape
通过
data Shape = Circle {r :: Double}
| Rectangle {l :: Double, w :: Double}
| Ellipsis {a :: Double, b :: Double}
deriving (Show)
所以现在getShape circle [circle1, ellipsis1, circle2, rectangle1, rectangle2]
应该产生 [circle1,circle2]
。
请尝试给你的问题中的所有定义和工作代码。 – epsilonhalbe