【问题标题】:parse error (possibly incorrect indentation or mismatched brackets) on line with let使用 let 解析错误(可能是不正确的缩进或不匹配的括号)
【发布时间】:2021-07-02 16:15:38
【问题描述】:

我明白了

解析错误(可能是不正确的缩进或不匹配的括号)

在线与| i > j = do swap axs p j

apartition :: Ord a => STArray s Int a -> Int -> Int -> ST s Int
apartition axs p q = do 
  x <- readArray axs p
  let loop i j
    | i > j = do swap axs p j
                 return j
    | otherwise = do u <- readArray axs i
                     if u < x 
                       then do loop (i + 1) j 
                       else do swap axs i j
                            loop i (j − 1)
  loop (p + 1) q

我真的很困惑这件事的原因,有人可以帮我解决一下吗?

【问题讨论】:

  • @SimonShine:这是一个do 块,所以in 不是必需的。

标签: haskell compiler-errors parse-error


【解决方案1】:

这是一个缩进错误,你需要在loop的定义开始的右边至少放置一个字符,所以:

apartition :: Ord a => STArray s Int a -> Int -> Int -> ST s Int
apartition axs p q = do 
  x <- readArray axs p
  let loop i j
       | i > j = do swap axs p j
                    return j
       | otherwise = do u <- readArray axs i
                        if u < x 
                        then do loop (i + 1) j 
                        else do swap axs i j
                                loop i (j - 1)
  loop (p + 1) q

【讨论】:

  • 您好,非常感谢您的快速回复!解决方案奏效了。解析器的这种行为有什么具体原因吗?计时器结束后,我会接受答案!
  • @MisterBabu: let(在do 语句或let...in... 表达式中)开始一个布局块,就像caseof…、wheredo,因为 let 可能包含多个定义。更正代码中的let 语句被解释为let { loop i j | i &gt; j = … | otherwise = …; };。在您的原始代码中,它是 let { loop i j; }; + indent + | i &gt; j = …,它无法解析。在这种情况下,我的偏好是写 let + newline + indent ,就像你的外部 do 块一样,所以这种对齐并不重要。 (这同样适用于您的内部 do 块。)
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 2015-01-26
  • 2018-01-21
  • 1970-01-01
  • 2021-01-25
  • 2022-09-28
  • 2016-09-28
  • 2017-06-06
相关资源
最近更新 更多