起初我想調整你的形狀類型:
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