從一些書,我有下面的代碼片段「做」和「哪裏」混合?
mutableUpdateIO :: Int -> IO (MV.MVector RealWorld Int)
mutableUpdateIO n = do
mvec <- GM.new (n + 1)
go n mvec
where
go 0 v = return v
go n v = (MV.write v n 0) >> go (n - 1) v
mutableUpdateST :: Int -> V.Vector Int
mutableUpdateST n =
runST $ do
mvec <- GM.new (n + 1)
go n mvec
where
go 0 v = V.freeze v
go n v = (MV.write v n 0) >> go (n - 1) v
像hindent
縮進他們。現在我想介紹所有的大括號和分號,所以空白不再相關。只因爲我好奇。
第二個例子表明,where
屬於整個runST $ do ...
表達式,但是第一個例子表明,where不知何故是go n mvec
語句的一部分。在Haskell Report Chapter 2.7閱讀中,我試圖引進括號和分號在第一個例子像
mutableUpdateIO :: Int -> IO (MV.MVector RealWorld Int)
mutableUpdateIO n = do {
mvec <- GM.new (n + 1);
go n mvec;
where {
go 0 v = return v;
go n v = (MV.write v n 0) >> go (n - 1) v;
} ; }
但我得到一個解析錯誤。這是爲什麼?
爲什麼佈局hindent
產生的第一個例子mutableUpdateIO
有效的Haskell?不應該在我的上述嘗試中引入大括號和分號嗎?
'where'與'do' afaik分開。我認爲哪裏會自動具有功能範圍。 – Carcigenicate
關聯:https://stackoverflow.com/questions/9721354/in-haskell-what-is-the-scope-of-a-where-clause-when-dealing-with-guards – Carcigenicate
'do ...'是一個表達。 「where」從不附加到表達式,只附加到聲明。 – melpomene