2

考虑以下示例:

data TestType = Free | Occupied { oc_field1 :: Int,
                                  oc_field2 :: Int,
                                  oc_field3 :: Int,
                                  oc_field4 :: Int
                                }

type SampleTest = [TestType]

filterOccupied :: SampleTest -> SampleTest
filterOccupied test = filter (\x -> case x of
                                 Occupied _ _ _ _ -> True
                                 Free -> False ) test

在上面的示例中,在 filterOccupied 内部,我必须使用四个_来匹配Occupied类型。

当记录有十多个字段时,这变得非常痛苦。有一个更好的方法吗 ?

4

3 回答 3

5

您可以改用{}模式。

filterOccupied :: SampleTest -> SampleTest
filterOccupied test = filter (\x -> case x of
                                 Occupied {} -> True
                                 Free -> False ) test
于 2013-10-04T06:08:36.293 回答
3

添加到 snak 的答案中,使用列表理解也可能更容易:

filterOccupied :: SampleTest -> SampleTest
filterOccupied test = [x | x@(Occupied {}) <- test]

只有与模式匹配的项目才会保留在列表中。

于 2013-10-04T07:27:41.953 回答
0

关于什么:

data TestType = Free
              | Occupied { oc_field1 :: Int
                         , oc_field2 :: Int
                         , oc_field3 :: Int
                         , oc_field4 :: Int
                         }
    deriving Eq

filterOccupied :: [TestType] -> [TestType]
filterOccupied = filter (Free/=)
于 2013-10-04T07:37:21.627 回答