Haskell中带参数的函数

时间:2014-04-06 15:53:11

标签: 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

2 个答案:

答案 0 :(得分: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的新手 - 这里是haskell最强大的概念之一:模式匹配

circle (Circle _)检查其参数是否具有类型Circle,其中type类似于OO语言中的构造函数。 _被称为 I-don&t-care-variable ,当名称适合时,它会被使用。因此,圈子检查它所获得的ShapeCircle并且不关心它所具有的半径并返回True - 或者 - 在任何其他情况下它返回{{1} }}。 这也可以,如果几周后我决定再添加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]

答案 1 :(得分: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