में अनिवार्य पाश मैं हास्केल में मोनैड सिस्टम को समझने की कोशिश कर रहा हूं। मेरे पिछले प्रोग्रामिंग प्रयोग का लगभग 80% सी में है, लेकिन विडंबनात्मक रूप से हास्केल का अनिवार्य हिस्सा समझना सबसे कठिन है। सूची में हेरफेर और आलसी मूल्यांकन अधिक स्पष्ट था। वैसे भी मैं ghc इस कोड को स्वीकार करना चाहता हूँ। मुझे पता है कि कोड बिल्कुल समझ में नहीं आता है। सबसे स्पष्ट रूप से, मैं Bool
पास कर रहा हूं जहां IO Bool
अपेक्षित है। लेकिन यह एकमात्र समस्या नहीं है। मुझे पता है कि यह एक बेवकूफ सवाल है, लेकिन कृपया मुझे हास्केल भाषा की मेरी समझ को आगे बढ़ाने में मदद करें।हास्केल
import Control.Monad
while :: Monad m => m Bool -> m() -> m()
while cond action = do
c <- cond
when c $ do
action
while cond action
main :: IO()
main = do
i <- 0
while (i < 10) $ do
i <- i + 1
print i
यहाँ कैसे मैं अंत में यह किया है। मुझे पता है allocaArray
आवश्यक नहीं है, लेकिन इसका उपयोग करना बहुत मजेदार था। हास्केल में वास्तव में कोई सीमा नहीं है, बहुत शक्तिशाली है।
import Control.Monad
import Data.IORef
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Array
while :: Monad m => m Bool -> m() -> m()
while cond action = do
c <- cond
if c then do
action
while cond action
else return()
main :: IO()
main = do
let n = 10
allocaArray n $ \p -> do
i <- newIORef 0
while (liftM (< n) (readIORef i)) $ do
i2 <- readIORef i
poke (advancePtr p i2) i2
modifyIORef i (+ 1)
writeIORef i 0
while (liftM (< n) (readIORef i)) $ do
i2 <- readIORef i
(peek $ advancePtr p i2) >>= print
modifyIORef i (+ 1)
चलिए स्पष्ट से शुरू करते हैं। 'i' एक परिवर्तनीय चर नहीं है, और यह केवल इसलिए नहीं बनता है क्योंकि आपके पास एक मोनैड है। 'i <- i + 1' दो अलग-अलग 'i' को संदर्भित करता है। –
'जबकि' निर्माण का शायद ही कभी हास्केल में उपयोग किया जाता है, मुझे लगता है कि हास्केल में यह वास्तव में आपको अनिवार्य भाषाओं में उपयोग किए जाने वाले लोगों के लिए प्राकृतिक रूप से "चर" का उपयोग करने की अनुमति नहीं देता है। आप * एक ही चीज़ को और अधिक अजीब तरीके से कर सकते हैं, लेकिन आपको 'डेटा.आईरफ़' या 'Control.Concurrent.MVar' जैसे म्यूटेबल संदर्भों का उपयोग करना होगा। जब तक आपको वास्तव में म्यूटेबल अपडेट की आवश्यकता न हो, तब तक इसे कार्यात्मक रूप से व्यक्त करना आम तौर पर बेहतर होता है। –
ध्यान दें कि इस तरह से 'आईओआरआईएफ' का उपयोग करके लूप काउंटर को "बॉक्सिंग" किया जाता है, इसलिए प्रत्येक पुनरावृत्ति पर एक नया 'Int' बॉक्स आवंटित किया जाएगा और काउंटर तक पहुंचने में सूचक संकेत शामिल है। जब आप अधिक कार्यात्मक-शैली काउंटर से निपटते हैं, तो जीएचसी आमतौर पर इसे अनबॉक्स कर सकता है, जिससे तेज़ कोड होता है। – dfeuer