2016-04-12 50 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 _ = []