2013-10-04 192 views
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個字段時,這會變得非常痛苦。有一個更好的方法嗎 ?

回答

5

您可以改爲使用{}模式。

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

添加到零食的回答,這也可能與列表理解簡單:

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

與模式相匹配的項目被保留在列表中。

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/=) 
+0

我不喜歡用平等的測試,你可以使用模式匹配,而不是,因爲它產生虛假的'Eq'約束(這是更糟與'(== [])' ,你在新的Haskellers的代碼中看到的,因爲那麼*元素*就會得到約束)。再加上它不夠優雅。如果你真的想要這樣的話,定義'isFree' /'isOccupied'函數將是我的首選方法。 –