【问题标题】:parse error on input 'let' Haskell输入'let' Haskell 解析错误
【发布时间】:2014-09-18 19:59:14
【问题描述】:

我想将字符串中的每个字符存储在我从文件中读取的列表中。所以我正在对名为“st”和 i="0" 的字符串列表进行递归,以一次获取一个字符串,我正在调用这个函数来自我的主函数,但我在 let 上遇到解析错误,我无法得到它。你能猜出来吗??

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")

【问题讨论】:

  • 您在此处看到的正是您的模块中的内容吗?因为这段代码永远不会解析。曾经。 Haskell 的语法基于缩进(除非你使用花括号和分号)。
  • 不能怪编译器,我也不能解析这个。压痕完全损坏。除此之外,您的do 块中似乎缺少do

标签: haskell


【解决方案1】:

首先,让我们添加缩进。 Haskell 依赖于缩进或花括号和分号:

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'

因为您需要在 then 子句中启动 do 块以链接操作。

对于刚接触 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" 周围有不必要的括号
  • get' st i=do 中不必要的 do - if 块是单个表达式,因此您没有将任何东西链接在一起。

另外,您使用的 print 可能无法满足您的需求。 print "hey" 打印 "hey"\n(带引号),其中 putStr "hey" 仅打印 hey(不带引号),putStrLn "hey" 打印 hey\n

【讨论】:

  • 不知道,Haskell 关心身份识别。我只是一个学习 Haskell。感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2016-01-11
相关资源
最近更新 更多