2014-04-06 92 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