我想存储我从file中读取的列表中的字符串中的每个字符。所以我正在通过名为“st”和i =“0”的字符串列表进行递归,以便一次获得一个字符串并且我正在调用这个函数来自我的主要但我得到解析错误让我无法得到它。你能搞清楚吗?
get' st i=do
if i<(length st)
then print(st!!i)
let j=0
let j=i
let i=j+1
get' st i
else
print ("hi")
答案 0 :(得分:11)
首先,让我们添加缩进。 Haskell依赖于缩进或大括号&amp;分号:
get' st i=do
if i<(length st)
then
print(st!!i)
let j=0
let j=i
let i=j+1
get' st i
else
print ("hi")
这仍然会出错
Temp.hs:4:5: parse error on input `let'
因为您需要启动do
块来链接then
子句中的操作。
对于刚接触Haskell的人来说,这是一个相当常见的错误。 then
条款只有一个表达式。如果要从一系列操作中构建单个表达式,则需要do
。
所以让我们补充说:
get' st i=do
if i<(length st)
then do
print(st!!i)
let j=0
let j=i
let i=j+1
get' st i
else
print ("hi")
现在你编译。
有许多批评可以改进您的代码:
length st
,这会使您的代码O(n^2)
成为字符串的长度。你可以计算一次但是...... st!!i
,而是使用模式匹配来解构列表let j=0; let j = i; let i = j+1; get' st i
(可以缩短为let i=i+1; get' st i
甚至更好get' st (i+1)
。length st
和"hi"
do
中不必要get' st i=do
- if
块是单个表达式,因此您不会将任何内容链接在一起。此外,您正在使用可能无法执行所需操作的print
。 print "hey"
打印"hey"\n
(带引号),putStr "hey"
只打印hey
(无引号),putStrLn "hey"
打印hey\n
。