BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Facebook Retrieを使用した大規模なHaskellコードベースのリファクタリング

Facebook Retrieを使用した大規模なHaskellコードベースのリファクタリング

原文(投稿日:2020/07/15)へのリンク

Facebookは、自社のSigma不正行為防止ルールエンジンをリファクタリングするために、ツールをオープンソース化したRetrieという名前のこのツールを使用すると、開発者はリライトを正規表現ではなくHaskell構文の方程式として記述することができる。

Facebookによると、RetrieはHaskellコードをより速く、より簡単に、より安全にリファクタリングすることを目的としている。

Retrieの機能には、式、タイプ、パターンをリライト機能があります。スクリプトのリライトとサイド条件を追加する機能があります。さらに高度なリライトをスクリプト化するためのライブラリがあります。Retrieは、ローカルスコープを尊重して維持し、ホワイトスペースを保持し、コードコメントをリライトしません。

Retrieは、高速だが表現力に欠けるテキスト指向のリファクタリングツールと、より強力であるが使いづらく、著しく遅い、より複雑なASTベースのツールとの間でバランスを取ることを試みている。代わりに、RetrieではHaskell構文で表現された方程式を使って、コードに適用する変換が記述される。たとえば、次の方程式がある。

forall f g xs. map f (map g xs) = map (f . g) xs

これを使用してfoo関数を変換することができる。

module MyModule where 
foo :: [Int] -> [Int] 
foo ints = map bar (map baz ints)

から

module MyModule where 
foo :: [Int] -> [Int] 
foo ints = map (bar . baz) ints

この変更を元に戻したい場合は、次の方程式を使用して簡単に行うことができる。

forall f g xs. map (f . g) xs = map f (map g xs)

上記の方程式は、次のコマンドライン構文を使用して、ディレクトリ内のすべてのファイルに適用できる。

retrie --adhoc "forall f g xs. map f (map g xs) = map (f . g) xs"

Retrieは式、タイプ、パターンをリライトすることができ、完全に構文をサポートするためにGHCのパーサーを使用する。プラス面として、Retrieはローカルスコープを尊重するため、シャドウイング/キャプチャーのバグが発生せず、不完全な式のフラグメントをリライトすることができない。さらに、必要に応じて括弧を自動的に追加または削除する。

前述のように、FacebookはRetrieを使用して、Sigma不正使用防止エンジンのルールを新しいAPIとライブラリに安全に移行した。

最後に、Retrieをライブラリとして統合し、Haskellプログラム内でMonadなDSLを直接使用して、より高度なリファクタリングを有効にすることもできる。

この記事に星をつける

おすすめ度
スタイル

BT