2013-04-08 10 views
10

sık sık kendimi şöyle kod yazarken bulduğunda: Belki daha iyi bir yolduriçine Birli ifadesini Feeding sürece veya

import System.Directory (doesFileExist) 
import Control.Monad (unless) 

example = do 
    fileExists <- doesFileExist "wombat.txt" 
    unless fileExists $ putStrLn "Guess I should create the file, huh?" 

:

example2 = 
    doesFileExist "wombat.txt" >>= 
    (\b -> unless b $ putStrLn "Guess I should create the file, huh?") 

iyi yaklaşım Burada ne var?

+5

' (>> =) 'bir bölümü ile yapılabilir, '' şey >> = (' unless' someAction) '', 'halinde someAction' kısadır. Kısa değilse, bence bool <- bir şey; Bool $, ne olursa olsun, daha iyisini yapar. –

+1

Hesabınızı 'MaybeT' içine gömdüğünüzde daha iyi çalışan 'mfilter' kullanabilirsiniz. –

cevap

5

Ben bir yardımcı işlevi tanımlayabiliriz:

unlessM :: Monad m => m Bool -> m() -> m() 
unlessM b s = b >>= (\t -> unless t s) 

example3 = unlessM (doesFileExist "wombat.txt") $ 
    putStrLn "Guess I should create the file, huh?" 

Çok yararlı olacağını unlessM gibi görünüyor. Ancak Hackage'da unlessM (ya da bu tip imzayla) gibi bir şey görmüyorum, bu durumu halletmem için daha iyi bir yol olduğunu düşünmüyorum; Havalı çocuklar ne yapar?

+2

İşte bir sürümü: http://hackage.haskell.org/packages/archive/cond/0.4.0.2/doc/html/Control-Conditional.html#v:unlessM –

+1

['extra'] var (https : //hackage.haskell.org/package/extra-1.6/docs/Control-Monad-Extra.html) ayrıca 'noneM 'sağlayan ve daha aktif bir şekilde korunan bir paket. –

5

Bu gibi durumlarda flip unless'u kullandım, ancak bu tür taraklayıcılar biraz gürültülü olabilir. LambdaCase uzantısıyla, en azından doesFileExist sonucu için bir isim kullanmaktan kaçınabilirsiniz, ancak True ve False modellerinde kalıp eşleşmesine neden olabilirsiniz, bu da biraz garip görünebilir (if'un gereksiz olduğunu veya olmasın). ile unless` `bağlanma

{-# LANGUAGE LambdaCase #-} 
import System.Directory (doesFileExist) 
import Control.Monad (unless) 

example' = 
    doesFileExist "wombat.txt" >>= 
    flip unless (putStrLn "Guess I should create the file, huh?") 

example'' = 
    doesFileExist "wombat.txt" >>= \ case 
    True -> return() 
    False -> putStrLn "Guess I should create the file, huh?" 
İlgili konular