在Haskell中使用let ... in和where子句的正确语法

时间:2016-02-08 10:53:29

标签: haskell syntax where-clause parse-error let

我试图在haskell中使用where和let-in子句声明局部变量(在haskell的情况下这是正确的术语吗?)。但是,每当我的子句长于一行时,我总会得到一些解析错误:

> letExample :: Int -> Int
> letExample 0 = 0
> letExample n =
>               let one     = 1
>                   four    = 4
>                   eight   = 8
>               in one*four*eight

当尝试将上述代码加载到ghci时,我收到以下错误:

letexample.lhs:4:33:
parse error in let binding: missing required 'in' Failed, modules loaded: none.

尝试加载以下代码时出现以下错误:

whereexample:5:57: parse error on input ‘=’
Failed, modules loaded: none.

代码:

> whereExample :: Int -> Int
> whereExample 0 = 0
> whereExample n = one * four * eight
>               where   one     = 1
>                       four    = 4
>                       eight   = 8

在上述情况下使用let和where的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

发布的代码混合了标签和空格。这是压痕问题的常见原因。

定义语言的Haskell报告指出制表符相当于8个空格。如果您的编辑器被配置为将标签显示为另一个空格数,那么对于编译器而言,您正在阅读的正确级别缩进的可能性实际上并非如此。

最简单的解决方法是使用源文件中的空格替换制表符。为此,我建议打开通过-Wall标志或添加

的警告
{-# OPTIONS -Wall #-}

在源文件的开头。这样做会导致GHC在检测到标签时发出警告。

还有alternative solutions来彻底删除所有标签。在" tab-agnostic"中可以通过智能方式混合标签和空格。方式,这将使代码可编辑和可读,尽管选项卡相当于多少空格。虽然不是很受欢迎,但这些提案有其技术优势。