输入解析错误' let'哈斯克尔

时间:2014-07-27 13:41:54

标签: haskell

我想存储我从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")

1 个答案:

答案 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块是单个表达式,因此您不会将任何内容链接在一起。

此外,您正在使用可能无法执行所需操作的printprint "hey"打印"hey"\n(带引号),putStr "hey"只打印hey(无引号),putStrLn "hey"打印hey\n