1

好的,所以这是一个奇怪的。

这完美地工作:

test = do
  x <- [1..5]
  y <- [1..5]
  [x+y, x-y]

但是这个:

test = do
  x <- [1..5]
  y <- [1..5]
  [
    x+y,
    x-y
  ]

惨败。GHC 完全拒绝解析这一点。无论我如何坐立不安,我似乎都无法说服 GHC 允许我将列表分布在多行中。这是一个问题,因为如果你用非常x+y的表达式替换和,它很快就会变得难以阅读......x-y

有谁知道为什么这不起作用,我该如何强制它起作用?(或者至少做一些看起来清晰的事情?)

4

3 回答 3

4

之后do,与之后的第一个单词在同一列上开始的每一行都do开始一个新条目。使用显式大括号,您的代码相当于

test = do
  { x <- [1..5]
  ; y <- [1..5]
  ; [
      x+y,
      x-y
  ; ]
  }

这是由于缩进规则。正如我们所看到的,最后一个分号不应该在那里——为了避免它,我们应该更多地缩进最后一行。

于 2017-07-08T09:08:12.547 回答
2

如果我解析这个,我会收到以下错误:

File.hs:10:3: error:
    parse error (possibly incorrect indentation or mismatched brackets)

我认为解析器只是将右方括号]视为一个新语句。它抱怨前一个语句没有右括号(新的语句是没有左括号的右括号)。如果你将它推到右边一列,它会正确解析(至少在 GHC-8.0.2 中)

test = do
  x <- [1..5]
  y <- [1..5]
  [
    x+y,
    x-y
   ] -- one space to the right

只要你不回到之前的缩进级别(这里左边一个空格),它应该没问题。因为编译器会将其视为一个do语句。

于 2017-07-08T08:33:59.390 回答
2

以下是合法编写此内容的几种可能方法:

test = do
  [x,y] <- replicateM 2 [1..5]
  [
    x+y
   ,x-y
   ]

test = do
  [x,y] <- replicateM 2 [1..5]
  [ x+y
   ,x-y ]

test = do
  [x,y] <- replicateM 2 [1..5]
  [ x+y ,
    x-y ]

test = do
  [x,y] <- replicateM 2 [1..5]
  id [ x+y
     , x-y ]

test = do
  [x,y] <- replicateM 2 [1..5]
  id [
       x+y,
       x-y
     ]

test = do
  [x,y] <- replicateM 2 [1..5]
  ([
     x+y,
     x-y
   ])
于 2017-07-08T09:33:27.193 回答