簡體   English   中英

解析列表monad的`do`表示法中的錯誤

[英]Parse error in list monad's `do` notation

好,這是一個奇怪的地方。

這完美地工作:

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+yxy ,它將很快變得難以閱讀...

有人知道為什么這行不通嗎,我怎么能強迫它行呢? (或者至少做了看起來清晰的事情?)

do之后,與do之后的第一個單詞在同一列上開始的每一行開始一個新條目。 使用大括號,您的代碼等效於

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

這是由於縮進規則 如我們所見,最后一個分號不應該在那兒-為了避免它,我們應該使最后一行縮進更多。

如果我對此進行解析,則會出現以下錯誤:

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語句。

以下是幾種可能的合法書寫方式:

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
   ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM