【问题标题】:Haskell read lines of fileHaskell读取文件行
【发布时间】:2012-06-16 20:10:39
【问题描述】:

我想将整个文件读入一个字符串,然后使用函数lines 来获取字符串的行。我正在尝试使用这些代码行:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
   linesOfFiles <- lines content

但我通过编译失败的广告得到以下错误:

Couldn't match expected type `IO t0' with actual type `[String]'
In the return type of a call of `lines'
In a stmt of a 'do' block: linesOfFiles <- lines content

我认为通过将readFile 的结果绑定到内容,它将是String 数据类型,为什么不是?

【问题讨论】:

    标签: file haskell io


    【解决方案1】:

    我认为通过将 readFile 的结果绑定到 content 它将是 String DataType,为什么不是?

    确实是String,这不是编译器所抱怨的。我们来看代码:

    main = do
       args <- getArgs
       content <- readFile (args !! 0)
    

    现在content 根据需要是一个普通的String。然后lines content[String]。但是你在下一行使用一元绑定

       linesOfFiles <- lines content
    

    IO () do-block 中。因此,编译器期望在&lt;- 的右侧有一个IO something 类型的表达式,但它找到了[String]

    由于计算lines content 不涉及任何IO,您应该使用let 绑定而不是一元绑定来绑定其结果,

       let linesOfFiles = lines content
    

    是你需要的那条线。

    【讨论】:

    • 此外,为了完整性,将其与 getArgs 和 readFile 的类型进行比较。
    • 这个解决方案是如何工作的?您不能将content 传递给lines,因为lines 的类型是String -&gt; [String],而content 的类型是IO String
    • @kjh 不,contentStringreadFile (args !! 0) 的类型是IO String,我们将content 绑定到IO-action 的“结果”。构造 do { a &lt;- action; stuff; } 脱糖成 action &gt;&gt;= \a -&gt; stuff,如果 action 的类型为 IO t,则 a 的类型为 t
    • 我现在明白了。谢谢你的澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2011-07-21
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多