1. ホーム
  2. haskell

[解決済み] キュアリングを利用するためのパラメータの順序付け

2023-02-08 08:56:48

質問

最近2回ほど、パラメータの順番を変更するためにコードをリファクタリングしました。 flip または \x -> foo bar x 42 が起こっていたのです。

関数シグネチャを設計するとき、どのような原則があれば、キュアリングを最大限に活用できますか?

どのように解決するのですか?

curryingや部分適用を簡単にサポートする言語については、もともとChris Okasaki氏による説得力のある一連の議論があります。

  • データ構造を最後の引数として置く

なぜですか?それは データに対して演算を行うことができます。 をうまく組み合わせることができます。例えば insert 1 $ insert 2 $ insert 3 $ s . また、これは 関数に役立ちます。 .

コンテナなどの標準的なライブラリ。 はこの規約に従います。 .

データ構造を最初に置くために代替の引数が与えられることがあります。そうすれば、静的な構造に対する関数(例えばルックアップ)がもう少し簡潔になります。しかし、これは、特に、大きく括弧で囲まれたコードに押しやられてしまうので、あまり得策ではないというのが、大方の意見のようです。

  • 最も変化する引数を最後に置く

再帰的な関数では、最も変化する引数(例えばアキュムレータ)を最後の引数とし、最も変化しない引数(例えば関数の引数)を最初に置くことが一般的です。これは、データ構造の最後のスタイルとよく調和している。


岡崎の見解のまとめは エジソン文庫 (これもまたデータ構造ライブラリ)で紹介されています。

  • 部分的なアプリケーション : 部分的な適用を容易にするために、より静的である可能性の高い引数は通常他の引数の前に表示されます。
  • コレクションは最後に表示されます。 操作が単一のコレクションに問い合わせるか、既存のコレクションを変更するすべてのケースで、コレクション引数は最後に表示されます。これはHaskellデータ構造ライブラリの事実上の標準のようなもので、APIにある程度の一貫性を持たせるものです。
  • 最も一般的な順序 : 操作が複数のデータ構造上のよく知られた数学的関数を表す場合、引数はその関数の最も一般的な引数順序に一致するように選択されます。