Haskell 中 let ... in 和 where 子句的正确语法
Correct syntax of let ... in and where clauses in Haskell
我正在尝试使用 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 和 where 的正确使用方法是什么?
发布的代码混合了制表符和空格。这是缩进问题的常见原因。
定义语言的Haskell报告指出制表符相当于8个空格。如果您的编辑器配置为将制表符显示为另一个数量的空格,那么对于编译器而言,您阅读的缩进级别可能并非如此。
最简单的修复方法是在源文件中用空格替换制表符。为此,我建议打开通过 -Wall
标志的警告,或通过添加
{-# OPTIONS -Wall #-}
在源文件的开头。这样做会导致 GHC 在检测到标签时发出警告。
还有 alternative solutions 到彻底删除所有标签的方法。有一些聪明的方法可以以 "tab-agnostic" 的方式混合制表符和空格,这将使代码可编译和可读,而不管一个制表符相当于多少个空格。虽然不是很受欢迎,但此类建议有其技术优点。
我正在尝试使用 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 和 where 的正确使用方法是什么?
发布的代码混合了制表符和空格。这是缩进问题的常见原因。
定义语言的Haskell报告指出制表符相当于8个空格。如果您的编辑器配置为将制表符显示为另一个数量的空格,那么对于编译器而言,您阅读的缩进级别可能并非如此。
最简单的修复方法是在源文件中用空格替换制表符。为此,我建议打开通过 -Wall
标志的警告,或通过添加
{-# OPTIONS -Wall #-}
在源文件的开头。这样做会导致 GHC 在检测到标签时发出警告。
还有 alternative solutions 到彻底删除所有标签的方法。有一些聪明的方法可以以 "tab-agnostic" 的方式混合制表符和空格,这将使代码可编译和可读,而不管一个制表符相当于多少个空格。虽然不是很受欢迎,但此类建议有其技术优点。