繁体   English   中英

Haskell中let…in和where子句的正确语法

[英]Correct syntax of let … in and where clauses in Haskell

我试图使用where和let子句在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的正确方法是什么?

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

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

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

{-# OPTIONS -Wall #-}

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

还可以使用替代解决方案来彻底删除所有选项卡。 有一些聪明的方法可以以“与标签无关”的方式混合使用制表符和空格,尽管制表符等于多少空格,也可以使代码可编译和可读。 虽然不是很流行,但是这种建议有其技术优点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM