我已经被不同地告诉你,你可以使Haskell空白不敏感,正确使用{...; ...;}到目前为止,除了where子句之外,我已经能够做到这一点。有效的示例代码:
primes = 2 : sieve [3,5..]
where {sieve = ... };
同样如此:
primes = 2 : sieve [3,5..] where {sieve = ...};
但是这是一个解析错误:
primes = 2 : sieve [3,5..]
where {sieve = ...};
任何想法如何使where子句的空白不敏感?
答案 0 :(得分:4)
这不起作用,因为你对where
的缩进使得Haskell认为primes
的定义已经结束。然后它变得混乱,因为在顶层悬挂着where
条款。
您可以在某些关键字后使用{}
个屏蔽,即let
,where
,of
(如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
}
请注意模块级别的大括号的必要性,其中,由于报告的这一部分:
在这些显式开括号中,即使一条线缩进到先前隐式开括号的左侧,也不会对大括号外的构造执行布局处理。