17

Data.Listのパーティションで〜(レイジーパターンマッチング)を使用することのパフォーマンス上の利点は何ですか。レイジーパターンマッチングの考案された例は、タプルコンストラクター内の値が使用されない場合(f(x、y)= 1)に役立つことを示唆しています。パーティション(以下の選択)では、リストts、fsが常に使用されます(xに適用される述語pがTrueであるかどうか)。これは、十分な情報に基づいて使用する決定であると確信しています〜が、ポイントは何ですか?厳密なパターンマッチングをしてみませんか?

partition               :: (a -> Bool) -> [a] -> ([a],[a])
{-# INLINE partition #-}
partition p xs = foldr (select p) ([],[]) xs

select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
select p x ~(ts,fs) | p x       = (x:ts,fs)
                    | otherwise = (ts, x:fs)

(注:私はすでにここを見ました!それは上記の質問に答えません)

4

1 に答える 1

17

重要なのは、厳密なパターンマッチングでは、結果のアセンブルは、パーティション化されるリストの最後に達したときにのみ開始でき、特に、partition無限のリストではまったく機能しないということです。

パターンが厳密に一致している場合、引数はWHNFに対して評価される必要があります。つまり、最初のコンポーネントと2番目のコンポーネントのどちらに配置foldrするかを決定する前に、テール全体が終了している必要がありxます。

select p x (foldr (select p) ([],[]) (y:z:ws))
~> select p x (select p y (select p z (foldr (select p) ([],[]) ws)))

レイジーパターンマッチを使用すると、適切なコンポーネントの最初の要素としてペアがすぐに作成さxれ、残りの2つのリストは必要に応じて後で評価されます。

于 2012-09-14T18:01:39.443 に答える