2012-01-05 11 views
5

बैक स्टोरी: हास्केल और कार्यात्मक प्रोग्रामिंग को बेहतर ढंग से समझने के प्रयास में, मैंने खुद को कुछ असाइनमेंट दिए हैं। मेरा पहला असाइनमेंट एक प्रोग्राम बनाना है जो डेटा सेट (संख्याओं का एक सेट, ब्लॉग में शब्दों आदि) को देख सकता है, पैटर्न या दोहराव की खोज कर सकता है, उन्हें समूहित कर सकता है, और उन्हें रिपोर्ट कर सकता है।हास्केल

पर्याप्त आसान लगता है। :)

प्रश्न: मैं प्रोग्राम को टेक्स्ट फ़ाइल में डेटा से एक सूची चर बनाकर शुरू करना चाहता हूं। मैं readFile फ़ंक्शन से परिचित हूं, लेकिन मैं सोच रहा था कि डेटा इनपुट करने का एक और शानदार तरीका था या नहीं।

उदाहरण के लिए, मैं उपयोगकर्ता को प्रोग्राम और डेटा सेट लोड करने के लिए कमांड लाइन में ऐसा कुछ टाइप करने की अनुमति देना चाहता हूं।

./haskellprogram textfile.txt

वहाँ एक समारोह है कि इस अनुमति देगा है?

उत्तर

12
import System.Environment 

main :: IO() 
main = do 
    args <- getArgs 
    -- args is a list of arguments 
    if null args 
    then putStrLn "usage: ./haskellprogram textfile.txt" 
    else do contents <- readFile $ head args 
      putStrLn $ doSomething contents 

doSomething :: String -> String 
doSomething = reverse 

यह आपको शुरू करने के लिए पर्याप्त होना चाहिए। अब और अधिक मूल्यवान कुछ :)

कुछ इनपुट डेटा पार्स करने की बात हो रही है, तो आप प्रस्तावना से संबंधित कार्यों का उपयोग कर lines या words में अपने डेटा को तोड़ने पर विचार हो सकता साथ reverse बदलें।

+0

बहुत बहुत धन्यवाद। हालांकि मैं इस कोड को संकलित करने में सक्षम नहीं था। या यह सिर्फ एक उदाहरण के रूप में, छद्म कोड है? –

+0

@SubtleArray, मुझे खुशी है कि मैं मदद कर सकता हूं। क्या आप compile_ करने में सक्षम नहीं हो सकते हैं? यह छद्म कोड नहीं है। यह हालिया परिवर्तन के बाद संकलित हो सकता है। कोशिश करो। – Jan

+0

ghc इस भाग पर थोड़ा गड़बड़ हो गया _source.hs: 10: 13: अपेक्षित प्रकार 'IO() 'से वास्तविक प्रकार' [char]' _ से मिलान नहीं हो सका, लेकिन अब सब ठीक है। मैं आपके समय और मदद की सराहना करता हूं।अब जब कठिन हिस्सा तैयार किया गया है, तो मैं आसान सामान पर शुरू कर सकता हूं। (: डी फिर से धन्यवाद। –

4

आप getArgs फ़ंक्शन के लिए देख रहे हैं।

+0

यह वास्तव में सबसे अच्छी साइट है। : डी धन्यवाद। –

4

सूक्ष्म सरणी, मैं जब मैं पहली बार हास्केल, interact तैयार कर रही थी मेरी पसंदीदा उल्लेख का विरोध कभी नहीं कर सकते हैं:

module Main where 
main = interact doSomething 

doSomething :: String -> String 
doSomething xs = reverse xs 

आप तो यह cat textfile.txt | ./haskellprogram | grep otto या जो कुछ भी रूप में इस्तेमाल करते हैं। Data.Text में एक संस्करण भी है जिसे आप जानते हैं, और कुछ अन्य स्ट्रिंग-ईश पुस्तकालयों में कुछ अन्य हैं।

1

अपेक्षाकृत नया ReadArgs package के साथ खेलना:

{-# LANGUAGE ScopedTypeVariables #-} 

import ReadArgs (readArgs) 

main = do 
    (fname :: String, foo :: Int) <- readArgs 
    putStrLn fname 

परीक्षण ... readArgs साथ

$ runhaskell args.hs blahblah 3 
blahblah 

एक जलन यदि आप केवल एक ही तर्क है कि यह काम नहीं करता है। Hmmm...

एक बार जब आपके पास String के रूप में वांछित फ़ाइल नाम हो, तो आप सामान्य रूप से readFile का उपयोग कर सकते हैं।