使用Haskell输入数据

时间:2012-01-05 18:30:51

标签: shell haskell functional-programming io machine-learning

Back Story :为了更好地理解Haskell和函数式编程,我给自己做了一些任务。我的第一个任务是创建一个程序,可以查看数据集(一组数字,博客中的单词等),搜索模式或重复,对它们进行分组并报告它们。

听起来很容易。 :)

问题:我想让程序从文本文件中的数据创建列表变量开始。我熟悉 readFile 函数,但我想知道是否有更优雅的方式来输入数据。

例如,我想允许用户在命令行中键入这样的内容来加载程序和数据集。

  

./ haskellprogram textfile.txt

是否有允许此功能的功能?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

您正在寻找getArgs功能。

答案 2 :(得分:4)

Subtle Array,当我第一次学习Haskell时,我永远不会拒绝提及我的最爱,interact

 module Main where
 main = interact doSomething

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

然后将其用作cat textfile.txt | ./haskellprogram | grep otto或其他任何内容。您可能会了解Data.Text中的变体,以及其他字符串库中的其他变体。

答案 3 :(得分:1)

使用相对较新的ReadArgs package

{-# LANGUAGE ScopedTypeVariables #-}

import ReadArgs (readArgs)

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

...测试

$ runhaskell args.hs blahblah 3
blahblah

readArgs的一个不满是,如果你只有一个参数,它就无法运作。 Hmmm...

将所需的文件名称设为String后,您可以照常使用readFile