2012-04-19 8 views
1

のは、現在のディレクトリに存在しないファイルを見つけてみましょう:はモナドと純粋な機能を作曲

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

をそして今、私は、小数点表記で良いことをしたい:

filterM (liftM not . doesFileExist) files 

は別のアプローチにありますこれを行う?例えば、後に純粋な関数の合成のためにあまりよくない作品、ブレース必要があります:すべてのモナドはfmapとしてliftMとファンクタであるので

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

私は最後の例は、あなたが意図したものないとは思いません。それを型チェックするために、 'isExtensionPNG'は' Bool - > Bool'型を持たなければなりません。これはあまり意味がありません。 – hammar

+0

@hammarと合意すれば、おそらく 'not 'を使いたいでしょう。 isExtensionPNG' –

+4

「ポイント表記法」と呼ばれるものは、通常、「ポイントフリースタイル」*と呼ばれます(または、より卑劣なことに、「無意味なスタイル」)。 – dave4420

答えて

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

を、あなたはfmapは、関数合成を介して配布しているという事実を使用することができます。

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

あなたはので正直に言うけれども

filterM (liftM isExtensionPNG . liftM not . doesFileExist) files 

を書くことができ、私はあなたの元のバージョンを好みます。

関連する問題