2012-04-19 45 views
1

讓我們發現,在當前目錄中不存在的文件:撰寫一元和純函數

filterM (\f -> return . not =<< doesFileExist f) files 

,現在我想用點符號做的更好:

filterM (liftM not . doesFileExist) files 

是否有其他的方法來做這個?例如,後期的作品不是純粹的功能組成,以良好的,需要括號:

filterM (liftM (isExtensionPNG . not) . doesFileExist) files 
+3

我不認爲最後一個例子做你的原意。對於類型檢查,'isExtensionPNG'必須有'Bool - > Bool'類型,這沒有多大意義。 – hammar 2012-04-19 07:22:11

+0

同意@hammar,你可能想用'not。 isExtensionPNG' – 2012-04-19 07:23:35

+4

你稱之爲「點符號」通常被稱爲*「無點風格」*(或者更貶低地說,「毫無意義的風格」)。 – dave4420 2012-04-19 08:04:27

回答

2

您可以定義中綴運算符,使其更好寫:

infixr 9 .: -- same as . 

(.:) :: Monad m => (b -> c) -> (a -> m b) -> a -> m c 
f .: g = liftM f . g 


filterM (isExtensionPNG .: not .: doesFileExist) files 
2

因爲每個單子是liftM一個仿函數作爲fmap,您可以使用fmap分佈在函數組合的事實。

fmap (f . g) = fmap f . fmap g 

你可以寫,因此

filterM (liftM isExtensionPNG . liftM not . doesFileExist) files 

雖然說實話,我更喜歡原來的版本。