2016-02-08 42 views
0

我想在haskell中使用where和let-in子句声明局部变量(这是在haskell情况下的正确术语?)。然而,每当我的条款是不是一个单一的线长,我总是得到一些解析错误:Haskell中let和in子句的正确语法

> 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. 

代码:

0123试图加载下面的代码时出现以下错误
> whereExample :: Int -> Int 
> whereExample 0 = 0 
> whereExample n = one * four * eight 
>    where one  = 1 
>      four = 4 
>      eight = 8 

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

+14

您的发布代码混合了制表符和空格,GHC将制表符视为8个空格,并且这会打破缩进。我建议打开警告'-Wall',这样编译器就会报告这个警告,所以你知道有什么问题。一个简单的解决方案是避免制表符。有关更多解决方案,请参阅http://dmwit.com/tabs/ – chi

+1

**从不**混合选项卡和空格。它会在所有语言缩写显着的语言中打破代码。检查您的编辑器设置,并始终只使用制表符或仅使用空格(后者通常是首选)。 – Bakuriu

+0

为了记录,在StackOverflow上显示的这些示例看起来具有完全正确的布局和语法。 –

回答

2

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

定义语言的Haskell报告声明标签等价于8个空格。如果您的编辑器配置为将制表符显示为另一个空格,那么很可能您正在阅读的内容在正确的级别上缩进对于编译器来说实际上并非如此。

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

{-# OPTIONS -Wall #-} 

。这样做会导致GHC在检测到选项卡时发出警告。

还有alternative solutions到剧烈的删除所有选项卡之一。有一些聪明的方法可以将标签和空格按“标签不可知论”的方式混合使用,尽管标签有多少空间,但这样可以使代码更易于编辑和阅读。虽然不是很受欢迎,但这样的提议有其技术优点。