2008-09-13 10 views
13

मुझे ऐसा कुछ चाहिए जो फ़ाइल हैंडल जैसा दिखता हो लेकिन वास्तव में आई/ओ रीडायरेक्ट के लिए उपयोग करने के लिए इन-मेमोरी बफर द्वारा समर्थित है। मैं यह कैसे कर सकता हूँ?मैं हास्केल में इन-मेमोरी हैंडल कैसे बना सकता हूं?

+0

आप इस सवाल पर फिर से विचार करना चाह सकता है, एक नया जवाब है जिसे आपको देखना चाहिए। –

+0

@ पीटर मोर्टेंसन ऐसा लगता है कि जॉन का जवाब बिल्कुल वही है जो आप चाहते हैं। – PyRulez

उत्तर

0

संकलक को संशोधित किए बिना यह संभव नहीं है। ऐसा इसलिए है क्योंकि हैंडल एक सार डेटा प्रकार है, एक टाइपक्लास नहीं।

+0

सभी उत्तरों के लिए धन्यवाद। मैं वास्तव में जानना चाहता था कि ऐसा करने के लिए एक बेवकूफ हास्केल तरीका था जिसे मैं नहीं जानता था, इसलिए यह जवाब मुझे मुकदमा देता है। – airportyh

1

यह संभव नहीं हो सकता है। GHC, कम से कम, एक ओएस फ़ाइल डिस्क्रिप्टर रखने के लिए एक हैंडल की आवश्यकता होती है जिसका उपयोग सभी पढ़ने/लिखने/तलाश कार्यों के लिए किया जाता है।

जीएचसी स्रोतों से /libraries/base/IOBase.lhs देखें।

आप ओएस की सहायता को जोड़कर एक ही प्रभाव प्राप्त कर सकते हैं: एक अस्थायी फ़ाइल बनाएं, इसे हैंडल से कनेक्ट करें और फिर स्मृति I/O रीडायरेक्ट के लिए फ़ाइल को मैप करें। इस तरह, मेमोरी मैप किए गए अनुभाग में सभी हैंडल I/O दिखाई देंगे।

3

यदि आप सी या सिस्टम कॉल के संदर्भ में जो करना चाहते हैं उसे व्यक्त कर सकते हैं तो आप हास्केल के विदेशी फंक्शन इंटरफेस (एफएफआई) का उपयोग कर सकते हैं। मैंने mmap का उपयोग करने का सुझाव देना शुरू किया, लेकिन दूसरे विचार पर मुझे लगता है कि एमएमएपी गलत तरीके से मैपिंग कर सकता है भले ही आपने इसे अनाम विकल्प के साथ इस्तेमाल किया हो।

आप हैस्केल एफएफआई के बारे में हैस्केल.org विकी पर अधिक जानकारी प्राप्त कर सकते हैं।

1

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

  1. एक नया typeclass बनाएँ, वर्तमान संभाल यह का एक उदाहरण बनाने के लिए, इन-स्मृति-डेटा बात करने के लिए एक और उदाहरण लिखते हैं, और अपने कार्यक्रम इस सुविधा का उपयोग करने की आवश्यकता है, उन सभी बदल जाते हैं। संभवतः यह System.IO के बजाय System.SIO (या जो भी आप इसे कॉल करना चाहते हैं) आयात करने के समान सरल है। लेकिन यदि आप Data.ByteString जैसे पुस्तकालयों में कस्टम I/O रूटीन का उपयोग करते हैं, तो वहां और काम करने के लिए और अधिक काम है।

  2. आई/ओ पुस्तकालयों को इसका समर्थन करने के लिए उन्हें बढ़ाने के लिए पुनर्लेखन करें। तुच्छ नहीं, और बहुत सारे काम, लेकिन यह करना मुश्किल नहीं होगा। हालांकि, तब आपके पास उन सिस्टम के साथ संगतता समस्या है जिनके पास यह लाइब्रेरी नहीं है।

19

मैं सिर्फ एक पुस्तकालय जो इस प्रदान करता है, "घुंडी" [hackage] कहा जाता है लिखा था। आप Handle रों बनाने के लिए इसका उपयोग कर सकते हैं जो संदर्भ/संशोधित ByteString एक:

import Data.ByteString (pack) 
import Data.Knob 
import System.IO 

main = do 
    knob <- newKnob (pack []) 
    h <- newFileHandle knob "test.txt" WriteMode 
    hPutStrLn h "Hello world!" 
    hClose h 
    bytes <- Data.Knob.getContents knob 
    putStrLn ("Wrote bytes: " ++ show bytes) 
संबंधित मुद्दे