आप फ़ाइल को हटाने और बस अगर यह मौजूद नहीं है उबरने बंद बेहतर होगा:
import Prelude hiding (catch)
import System.Directory
import Control.Exception
import System.IO.Error hiding (catch)
removeIfExists :: FilePath -> IO()
removeIfExists fileName = removeFile fileName `catch` handleExists
where handleExists e
| isDoesNotExistError e = return()
| otherwise = throwIO e
यह किसी की रेस स्थिति के बीच फ़ाइल को हटाने से बचा जाता है अपने कोड जांच रहा है कि यह मौजूद है और इसे हटा देता है। यह आपके मामले में कोई फर्क नहीं पड़ता है, लेकिन यह वैसे भी अच्छा अभ्यास है।
import Prelude hiding (catch)
लाइन पर ध्यान दें - ऐसा इसलिए है क्योंकि प्रीलूड में अपवाद हैंडलिंग से पुराने कार्य शामिल हैं जिन्हें अब नियंत्रण.एक्सप्शन के पक्ष में बहिष्कृत किया गया है, जिसमें catch
नामक फ़ंक्शन भी है; आयात लाइन Control.Exception के पक्ष में प्रीलूड के catch
को आसानी से छुपाती है।
हालांकि, कि अभी भी अपने अधिक मौलिक अंतर्निहित सवाल छोड़: कैसे आप IO
में सशर्त, लिख सकता हूँ?
वैसे, इस मामले में, यह पर्याप्त होगा बस (Control.Monad.when का उपयोग कर)
when fileExists $ removeFile filename
क्या करना है। लेकिन यह यहां सहायक है, क्योंकि यह आमतौर पर प्रकारों को देखने के लिए हैस्केल में है।
एक सशर्त दोनों शाखाओं में एक ही प्रकार होना आवश्यक है। तो भरने के लिए
if fileExists
then removeFile filename
else ???
हम removeFile filename
के प्रकार पर गौर करना चाहिए; जो भी ???
है, यह एक ही प्रकार का होना चाहिए।
System.Directory.removeFile प्रकार FilePath -> IO()
है, इसलिए removeFile filename
प्रकार IO()
है। तो हम ()
के परिणामस्वरूप एक आईओ कार्रवाई चाहते हैं जो कुछ भी नहीं करता है।
खैर, return
के प्रयोजन के लिए एक कार्रवाई नहीं असर पड़ता है कि निर्माण करने के लिए है, और सिर्फ एक निरंतर मान देता है, और return()
इस के लिए सही प्रकार का है: IO()
(या अधिक सामान्यतः, (Monad m) => m()
)। तो ???
return()
है (जो आप देख सकते हैं जब removeFile
विफल रहता है मैं ऊपर मेरी बेहतर स्निपेट में इस्तेमाल किया, कुछ भी नहीं करना है क्योंकि फ़ाइल मौजूद नहीं है)।
(वैसे, तुम अब return()
की मदद से when
लागू करने में सक्षम होना चाहिए, यह वास्तव में आसान है :))
चिंता मत करो अगर आप इसे कठिन चीजों में से हास्केल मार्ग में प्राप्त करने के लिए लगता है पहले - यह समय पर स्वाभाविक रूप से आ जाएगा, और जब ऐसा होता है, तो यह बहुत ही फायदेमंद है। :)
'doesFileExist' फ़ंक्शन वास्तव में दौड़ की स्थितियों का निमंत्रण है। यह अस्तित्व में नहीं होना चाहिए। – augustss
@augustss: हम इसके बारे में सिर्फ 'didFileExistLastTimeIChecked' का नाम बदलते हैं? –
मैं सुझाव देता हूं 'didFileNotNeverExist'। – ehird