【问题标题】:Inputting Data with Haskell用 Haskell 输入数据
【发布时间】:2012-01-05 18:30:50
【问题描述】:

背景故事:为了更好地理解 Haskell 和函数式编程,我给自己布置了一些作业。我的第一个任务是编写一个程序,该程序可以查看数据集(一组数字、博客中的单词等),搜索模式或重复,将它们分组并报告它们。

听起来很简单。 :)

问题:我希望程序首先从文本文件中的数据创建一个列表变量。我对 readFile 函数很熟悉,但我想知道是否有更优雅的数据输入方式。

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

./haskellprogram 文本文件.txt

是否有允许这样做的函数?

【问题讨论】:

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


    【解决方案1】:
    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

    【讨论】:

    • 非常感谢。我无法编译这段代码。还是只是伪代码,例如?
    • @SubtleArray,我很高兴能帮上忙。您能否详细说明无法编译?这不是伪代码。它可能会在最近的更改后编译。试一试。
    • ghc 在这部分有点脾气暴躁 source.hs:10:13: 无法匹配预期的类型 IO ()' with actual type [Char]',但现在一切都很好.感谢您的时间和帮助。现在困难的部分已经解决了,我可以开始做简单的事情了。 (:D再次感谢。
    【解决方案2】:

    您正在寻找getArgs 函数。

    【讨论】:

    • 这确实是有史以来最好的网站。 :D 谢谢。
    【解决方案3】:

    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 中还有一个您可能会知道的变体,以及其他字符串库中的其他一些变体。

    【讨论】:

      【解决方案4】:

      使用相对较新的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

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2015-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多