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 内で型_を一致させるために 4 つを使用する必要がありますOccupied

レコードに 10 個を超えるフィールドがある場合、これは非常に苦痛になります。これを行うより良い方法はありますか?

4

3 に答える 3

3

snakの答えに加えて、これはリスト内包表記でも簡単かもしれません:

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

パターンに一致するアイテムのみがリストに保持されます。

于 2013-10-04T07:27:41.953 に答える