[英]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+y
和xy
,它將很快變得難以閱讀...
有人知道為什么這行不通嗎,我怎么能強迫它行呢? (或者至少做了看起來清晰的事情?)
在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.