使haskell where子句空格不敏感?

时间:2013-05-31 19:47:41

标签: haskell whitespace where

我已经被不同地告诉你,你可以使Haskell空白不敏感,正确使用{...; ...;}到目前为止,除了where子句之外,我已经能够做到这一点。有效的示例代码:

primes = 2 : sieve [3,5..] 
    where {sieve = ... };

同样如此:

primes = 2 : sieve [3,5..] where {sieve = ...};

但是这是一个解析错误:

primes = 2 : sieve [3,5..]
where {sieve = ...};

任何想法如何使where子句的空白不敏感?

2 个答案:

答案 0 :(得分:4)

这不起作用,因为你对where的缩进使得Haskell认为primes的定义已经结束。然后它变得混乱,因为在顶层悬挂着where条款。

您可以在某些关键字后使用{}个屏蔽,即letwhereof(如case foo of)和do。所以在你的情况下,你只需要省略换行符。

primes = 2:sieve [3,5..] where {
sieve = ....
}
primes' = 2:sieve [3,5..] where
{sieve = ...}

如果您真的想在任何地方使用它,您还必须使用显式模块声明

module Main where {
;primes' = 2:sieve [3,5..]
where {sieve = ...}
}

我建议不要这样做,只是使用缩进。 Haskell中的显式括号通常用于生成代码,当您看到它们手写时,它几乎总是使用do

答案 1 :(得分:2)

使用大括号和分号查看the haskell report's lexemes section的结尾。

这是我编译的一个简单程序:

module Temp where {
foo = 1           
where x = 2        
}                  

请注意模块级别的大括号​​的必要性,其中,由于报告的这一部分:

  

在这些显式开括号中,即使一条线缩进到先前隐式开括号的左侧,也不会对大括号外的构造执行布局处理。