GHCi 中的缩进问题

Indentation problems in GHCi

我正在学习 Haskell,当我尝试在 GHCi 中定义跨多行的函数时,不断出现这些缩进错误。这是重新定义 elem 函数的尝试:

λ: :{
| let elem' x xs
|     | null xs = False
|     | x == head xs = True
|     | otherwise = elem' x (tail xs)
| :}

<interactive>:15:5: error:
    parse error (possibly incorrect indentation or mismatched brackets)

= 标志是否需要以某种方式对齐?

你需要进一步缩进守卫。如果你让它们与 elem' 名称保持相同的缩进,GHC(i) 将尝试将它们解析为 let 块中的附加定义,而不是 [=14 定义的一部分=]:

let elem' x xs
        | null xs = False
        | x == head xs = True
        | otherwise = elem' x (tail xs)

如果您使用的是 GHC 8 或更高版本,则不需要 let 来定义 GHCi 中的内容,所以这个(在 :{:} 之间,和以前一样)将正常工作:

elem' x xs
    | null xs = False
    | x == head xs = True
    | otherwise = elem' x (tail xs)

A let 像这样缩进

let elem' x xs
    | null xs = False
    | x == head xs = True
    | otherwise = elem' x (tail xs)

是一个有四个条目的 let,很像

let x1 = ...
    x2 = ...
    x3 = ...
    x4 = ...

如果您想继续上一个条目,而不是开始一个新条目,您应该将其缩进更多。该规则在源文件和 GHCi 中是相同的。缩进规则一开始可能看起来有点神秘,但实际上是 .