2012-01-05 46 views
5

Back Story:爲了更好地理解Haskell和函數式編程,我給了自己一些作業。我的第一項任務是製作一個程序,可以查看數據集(一組數字,博客中的單詞等),搜索模式或重複,將它們分組並進行報告。使用Haskell輸入數據

聽起來很容易。 :)

問題:我想通過從文本文件中的數據創建列表變量開始程序。我熟悉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 

這應該足以讓你開始。現在將reverse替換爲更有價值的東西:)

說到解析某些輸入數據,您可能會考慮使用Prelude中的各個函數將數據分爲lineswords

+0

非常感謝。但我無法編譯此代碼。或者它只是僞代碼,作爲一個例子? – 2012-01-05 19:06:38

+0

@SubtleArray,我很高興能幫上忙。你能否詳細說明_was不能編譯?它不是僞代碼。它可能會在最近的變化之後編譯。試一試。 – Jan 2012-01-05 19:17:50

+0

ghc在這部分有點脾氣暴躁_source.hs:10:13:無法匹配實際類型爲'[Char]'_的預期類型'IO()',但現在一切正常。我感謝你的時間和幫助。現在,困難的部分已經制定出來,我可以開始輕鬆的事情。 (:D再次感謝。 – 2012-01-05 19:23:03

4

您在尋找getArgs的功能。

+0

這確實是有史以來最好的網站。 :D 謝謝。 – 2012-01-05 18:51:43

4

微妙的陣列,我永遠無法抗拒提我最喜歡的,當我第一次學習Haskell,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