2014-04-06 141 views
0

我試圖編寫一個函數,該函數有一個參數,您可以在其中指定要從函數中獲得的內容。Haskell中的參數函數

例子:首先,我會創建一些形狀具有以下功能:

circle1 :: Radius -> Shape 
circle r = Shape (Circle r) 

circle2 :: Radius -> Shape 
circle2 r = Shape (Circle r) 

rectangle :: Side -> Side -> Shape 
rectangle x y = Shape (Rectangle x y) 

現在讓我們說,我想我可以指定我只希望看到的圈子裏,我怎麼創建一個函數這樣的功能?因此,功能應該是這樣的:

getShapes(circle) 

和輸出應該是這樣的:

circle1 
circle2 
+0

請嘗試給你的問題中的所有定義和工作代碼。 – epsilonhalbe

回答

1

起初我想調整你的形狀類型:

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]

0

這是你在找什麼?

type Radius = Double 
type Side = Double 

data Shape = Circle Radius 
      | Rectangle Side Side 
    deriving (Show) 

isCircle :: Shape -> Bool 
isCircle (Circle _) = True 
isCircle _ = False 

circle1 :: Radius -> Shape 
circle1 r = Circle r 

circle2 :: Radius -> Shape 
circle2 r = Circle r 

rectangle :: Side -> Side -> Shape 
rectangle x y = Rectangle x y 

figures = [circle1 1.1, circle2 1.2, rectangle 1.3 1.4] 

circles = filter isCircle figures 

main = putStrLn $ show circles