根据具有记录语法的项目过滤列表

时间:2014-04-08 11:05:00

标签: haskell

我试图过滤我的物品清单,我似乎无法让它发挥作用。

我有一个数据类型图,声明如下:

data Shape = Square {length:: Float, color:: Color}
           | Rectangle {length:: Float, widht:: Float, color :: Color}
            ....

重复这几种形状 它们共同的属性是颜色,也是数据类型data Color = Yellow | Green | Blue

我尝试过像这样过滤

getByColor :: Color -> [Shape] -> [Shape]
getByColor _ [] = []
getByColor x item@{color=c}:xs
                             | c == x = item:getByColor x xs
                             | otherwise = getByColor x items

这给了我一个解析错误' {'当我试图运行它时。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

我在想我的问题。 一个匿名函数完成了这项工作。

记录语法为您提供自动访问功能,因此我能够执行以下操作

getByColor :: Color -> [Shape] -> [Shape]
getByColor colorParam shapes = filter (\shape -> color shape == colorParam) shapes

答案 1 :(得分:0)

这不是你问题的直接答案,而是一些建议。通常不鼓励使用求和类型和记录语法,因为非完全使用记录字段可以隐藏编译器中的错误并推迟到运行时。例如,如果在width上调用Shape,代码将编译,但在Shape为Square的情况下,将在运行时引发异常。

将特定于形状的行为放入自己的类型中通常是有意义的,并通过新类型在Shape中参数化构造函数 - 只有使用记录字段(如果它是全部的 - 为所有构造函数定义)。

我建议在这种情况下完全不使用记录语法,因为你可以简单地在常规产品上定义你想要的所有字段作为独立函数 - 并且不要从模块中公开Shape构造函数 - 只是一些函数创造它们。

module Shape (Shape, square, rectangle, length, color, width) where

import Prelude hiding (length)

data Shape = Square Float Color
           | Rectangle Float Float Color
           deriving (Eq, Show)

square = Square
rectangle = Rectangle

length (Square l _) = l
length (Rectangle l _ _) = l

color (Square _ c) = c
color (Rectangle _ _ c) = c

width (Rectangle _ w _) = Just w
width _ = Nothing