Haskell从文本文件

时间:2016-04-12 14:39:28

标签: haskell io

我是哈斯凯尔的新人。我试图从文件中读取每一行,例如这里是我的文本文件

5
1 4 8 6 8
5
2 4 7 9 2
0

所以结果应该是

1 4 8 6 8
2 4 7 9 2

这里我的代码看起来像

import System.IO  
import Control.Monad
import Data.List
import Data.Function
import Data.Array
import Data.Char

main = do
  file <- readFile "test.txt"
  print (lines file)
  let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]

我认为这段代码应该很好(如果没有,请纠正我),但我收到错误: do块中的最后一个语句必须是表达式。为什么我会收到此错误?

2 个答案:

答案 0 :(得分:3)

do notation是monad的语法糖。所以你的代码在desugared时将如下所示:

readFile "test.txt" >>= \file ->
print (lines file) >> 
let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
in ....

现在您可以看到表达式不正确。您可以详细了解此here

一个简单的解决方法就是使用return ()

main = do
  file <- readFile "test.txt"
  print (lines file)
  let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
  return ()

将使代码类型检查:

readFile "test.txt" >>= \file ->
print (lines file) >> 
let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
in return ()

但你想要的可能就是:

main = do
  file <- readFile "test.txt"
  let ff = map ((!!) (lines file)) [1,3..(length (lines file) - 1)]
  print ff

答案 1 :(得分:0)

另一个答案中建议的(!!)很臭。

{% for ticket in tickets %}
    <tr><td>{{ ticket.title }}</td></tr>
{% empty %}
    <tr><td>No results to show.</td></tr>
{% endfor %}

可替换地:

everyOther :: [a] -> [a]
everyOther = catMaybes . zipWith ($) (cycle [const Nothing, Just])