【问题标题】:Correct syntax of let ... in and where clauses in HaskellHaskell 中 let ... in 和 where 子句的正确语法
【发布时间】:2016-05-18 00:15:50
【问题描述】:

我正在尝试使用 where 和 let-in 子句在 haskell 中声明局部变量(在 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 的正确方法是什么?

【问题讨论】:

  • 您发布的代码混合了制表符和空格,GHC 将制表符视为 8 个空格,这会破坏缩进。我建议打开警告-Wall,以便编译器报告这一点,这样你就知道有问题了。一个简单的解决方案是避免使用制表符。更多解决方案见dmwit.com/tabs
  • 从不混合制表符和空格。它会破坏所有缩进很重要的语言的代码。检查您的编辑器设置,要么始终只使用制表符,要么只使用空格(通常首选后者)。
  • 作为记录,StackOverflow 上显示的这些示例似乎具有完全正确的布局和语法。
  • 正确的术语是绑定,而不是变量。
  • 感谢@AlexeyKuleshevich

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


【解决方案1】:

发布的代码混合了制表符和空格。这是缩进问题的常见原因。

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

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

{-# OPTIONS -Wall #-}

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

还有alternative solutions 到激烈的删除所有标签之一。有一些聪明的方法可以以“与制表符无关”的方式混合制表符和空格,这将使代码可编译和可读,尽管制表符相当于多少个空格。虽然不是很受欢迎,但这样的建议有其技术优点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2010-12-07
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多