Haskellでストリームフュージョンの対象となる独自のマップ関数を作成できますか?
リストに対する再帰的な反復が融合の対象にならないのはなぜですか?それはHaskellパターンマッチングの素晴らしい表現力を完全に殺します:foo (x:xx) ...
!
Preludeループ関数は融合されていますか?
Haskellでのストリーム融合は、書き換えルールを使用して行われます(詳細については、ghcのドキュメントを参照してください)。これらは、RULES
プラグマを使用してコードで指定できるルールです。
rewirteルールの基本的な考え方は、コンパイル時にコードを書き換えることができる一連の方法を指定することです。たとえば、独自のバージョンをmap
として定義した場合map'
、次のようなことができます。
{-# RULES
"map'/map'" forall f g xs. map' f (map' g xs) = map' (f . g) xs
#-}
これにより、と呼ばれる書き換えルールが導入されmap'/map'
ます。このルールが行うf
ことは、リスト上の関数のすべてのマッピングを書き換え、次にg
いくつかのxs
マッピングを(f . g)
これらのxの単一のマッピングに書き換えることです。
書き換えルールの使用には、さらに多くの微妙な点があります。たとえば、コンパイラのどのフェーズでルールを適用するかを指定できますが、コンパイラにはそれらのルールが正しいかどうかを確認する方法がありません。
リライトの結果は引き続きタイプチェックされますが、リライトルールで意味的に正しくないことを行った場合、それは純粋にあなた次第です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加