2016-04-12 16 views
0

我是哈斯克尔的新手。我想从文件中读取例如每第二行,这里是我的文本文件Haskell从文本文件中获得每隔一行

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块中的最后一条语句必须是一个表达式。为什么我得到这个错误?

回答

3

该符号是monads上的语法糖。所以你的代码在脱壳时看起来像这样:

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 
0

在另一个答案中提出的(!!)是臭的。

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

或者:

everyOther :: [a] -> [a] 
everyOther (x:x':xs) = x : everyOther xs 
everyOther _ = []