Back Story :为了更好地理解Haskell和函数式编程,我给自己做了一些任务。我的第一个任务是创建一个程序,可以查看数据集(一组数字,博客中的单词等),搜索模式或重复,对它们进行分组并报告它们。
听起来很容易。 :)
问题:我想让程序从文本文件中的数据创建列表变量开始。我熟悉 readFile 函数,但我想知道是否有更优雅的方式来输入数据。
例如,我想允许用户在命令行中键入这样的内容来加载程序和数据集。
./ haskellprogram textfile.txt
是否有允许此功能的功能?
答案 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
:)
答案 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
。