2011-11-01 4 views
6

リストを3つ以上同時に1つの式に追加したいと考えています。++を複数使用する:評価を右から左に強制すると効率的ですか?

a ++ b ++ c 

++演算子は左から右に評価されますか、または右から左に評価されますか?

1. (a ++ b) ++ c 
2. a ++ (b ++ c) 

++は、プレフィックス機能であれば、私たちは自然に最初++ b cの評価につながる++ a ++ b cを記述しますので、私は、オプション2を言うでしょう。私が正しいかどうか分からない。

しかし、それはオプション1だ場合、明示的に右から左に評価の順序を変更すると、より効率的であるように私には思える:a ++ b ++ cは、最初のn個のステップでab ++ cと評価されます(:なぜここに

a ++ (b ++ c) 

ですここで、nはaの長さであり、abはもちろんaとbの連結である)、次にn + mステップでabcになる(mはbの長さであるため、n + mはabの長さである)。合計2n + mステップを行う。一方、a ++ (b ++ c)は、最初にmステップでa ++ bcと評価され、次にnステップ以上ではabcと評価されます。これは合計n + mステップだけです。

私はhaskellを新しくしていて、私が何を言っているのかわからない、私はいくつかの確認をしたいと思います。 ghciから

答えて

11
a ++ b ++ c 

はあなたが記述正確な理由で

a ++ (b ++ c) 

として解析されます。(++)を左結合されていた、そしてa ++ b ++ cは二回aをコピーします。あなたはinfixr "は右結合中置を、" 意味

infixr 5 ++ 

で応答します

Prelude> :i (++) 

とGHCiの中でこれを確認することができます。

6

は、やる:i++は(中置と)右結合で、右から左に評価されることを示して

Prelude> :i (++) 
(++) :: [a] -> [a] -> [a] -- Defined in GHC.Base 
infixr 5 ++ 

。私は分かりませんが、実装した人は誰でも自分の質問を念頭に置いて正しい連想をとっていることを賭けても構わないと思います。

+2

そして、それinfixrは括弧なしで、それはオプション2 –

+0

私はその明示的に強調しているはずと仮定だということを意味します! –

+2

はい、++の結合性は、より効率的になるように正確に選ばれました。 – augustss

3

はまた、リストの任意の数を連結concat機能があります:

Prelude> :t concat 
concat :: [[a]] -> [a] 
Prelude> concat [[1], [2,3], [42,911]] 
[1,2,3,42,911] 
関連する問題