我是哈斯凯尔的新人。我试图从文件中读取每一行,例如这里是我的文本文件
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块中的最后一个语句必须是表达式。为什么我会收到此错误?
答案 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])