2012-01-05 76 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