2015-08-13 9 views
8

हास्केल में, हमारे पास साइड इफेक्ट्स से निपटने के लिए IO मोनैड है, हालांकि, यह साइड इफेक्ट्स को स्पष्ट रूप से ट्रैक करने में सक्षम नहीं है, आप वास्तव में नहीं जानते कि किस प्रकार का दुष्प्रभाव वास्तव में है हो रहा है: यह स्पष्ट रूप से है कि हैसाइड इफेक्ट्स को ट्रैक करने के लिए मोनाड

main :: forall e. Eff (fs :: FS, trace :: Trace, process :: Process | e) Unit 

यहाँ:

main :: IO() 

PureScript में, हम प्रकार हस्ताक्षर के अनुसार पर हो Eff इकाई है, जहां आप दुष्प्रभाव किस प्रकार पता करने में सक्षम हैं main फ़ंक्शन में फ़ाइलों का उपयोग किया गया है tem, कंसोल पर संदेशों का पता लगाने और वर्तमान प्रक्रिया को संभालने में सक्षम है, जहां हमारे पास साइड इफेक्ट्स से निपटने के लिए Control.Monad.Eff और Control.Monad.Eff.Random और Control.Monad.Eff.Console जैसे सबोड्यूल्यूल हैं।

उदाहरण से ले रहा है निम्नलिखित:

module RandomExample where 

import Prelude 

import Control.Monad.Eff 
import Control.Monad.Eff.Random (random) 
import Control.Monad.Eff.Console (print) 

printRandom :: forall e. Eff (console :: CONSOLE, random :: RANDOM | e) Unit 
printRandom = do 
    n <- random 
    print n 

यह इतना का उपयोग कर बस की तुलना में अधिक विशिष्ट है "अरे, यहाँ एक पक्ष प्रभाव, कि, यह कोई और अधिक है कि आप जानना चाहते हैं क्या होता है!"। मैं वेब के माध्यम से देख रहा हूं और मुझे साइड इफेक्ट्स को ट्रैक करने के लिए पर्याप्त मोनाड नहीं मिला।

साइड इफेक्ट्स को ट्रैक करने के लिए Eff जैसे हास्केल में एक विशिष्ट मोनड है?

अग्रिम धन्यवाद।

+1

अच्छी तरह से सभी प्रकार के दुष्प्रभाव हैं ताकि आप कौन सी चाहें? - उनमें से कुछ के अपने स्वयं के मोनैड (राज्य, ...) हैं और कई libs कुछ और (यसोड, ...) पेश करते हैं - लेकिन मुझे नहीं लगता कि आप उन्हें PureScript की तरह इकट्ठा नहीं कर सकते हैं - आमतौर पर ट्रांसफार्मर और मोनड- यह – Carsten

+0

करने के लिए स्टैक अवधारणा एक छोटा नाइटपिक: 'आईओ' * प्रभाव * है, साइड इफेक्ट्स नहीं। एक दुष्प्रभाव शुद्ध होने का नाटक करने वाले गणना की तरह कुछ बुरा होगा, लेकिन 'unsafePerformIO' के माध्यम से IO कर रहा है। – Cactus

उत्तर

4

कुछ पुस्तकालय हैं जो हास्केल के लिए समान प्रभाव प्रणाली को परिभाषित करते हैं।

मैं extensible-effects के साथ कुछ काम किया, और पाया यह काफी आसान प्रतिबंधित जोड़ना IO, जैसे STDIO, FileIO, प्रभाव है। कंपाइलर समर्थन की कमी का उपयोग करने के लिए थोड़ा कम अच्छा है।

क्या आप extensible-effects ढांचे के लिए मौजूदा प्रभाव में प्रेरणा पा सकते हैं इसे आज़माने के लिए करना चाहते हैं: http://hackage.haskell.org/package/effin: http://hackage.haskell.org/packages/#cat:Effect

उस Typeable का उपयोग नहीं करता प्रभाव को ट्रैक करने के extensible-effects का एक संस्करण हो रहा है। इसे नए प्रभाव लिखने के लिए अच्छा बनाना चाहिए।

संबंधित मुद्दे