は`do`と` where`はどうやってミックスされますか?私は、次のコードを持っているいくつかの本から
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 ...
という表現に属していますが、最初の例では、どこが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-withguards – Carcigenicate
'do ...'式です。 'where'は式には決して置かれず、宣言だけに付けられます。 – melpomene