我正在尝试编写一个函数,该函数有一个参数,您可以在其中指定您希望从函数中获取的内容。
示例:首先,我将使用以下函数创建一些形状:
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 :(得分: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 ,当名称适合时,它会被使用。因此,圈子检查它所获得的Shape
是Circle
并且不关心它所具有的半径并返回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