95

flip最近、ハッキングが発生したり発生したりするコードが多すぎたため、パラメーターの順序を変更するためにコードを 2 回リファクタリングしました\x -> foo bar x 42

関数シグネチャを設計するとき、カリー化を最大限に活用するのに役立つ原則は何ですか?

4

3 に答える 3

112

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

  • 最後の引数としてデータ構造を入れます

なんで?その後、データに対する操作を適切に構成できます。例insert 1 $ insert 2 $ insert 3 $ sこれは、関数 on state にも役立ちます。

「コンテナ」などの標準ライブラリは、この規則に従います

データ構造を最初に配置するために代替引数が与えられることがあります。そのため、データ構造を閉じて、静的構造 (ルックアップなど) に対してもう少し簡潔な関数を生成できます。ただし、特に括弧で囲まれたコードの方が強くなるため、これはあまり有利ではないというのが一般的なコンセンサスのようです。

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

再帰関数の場合、最も変化する引数 (アキュムレータなど) を最後の引数として置き、変化が最も少ない引数 (関数の引数など) を最初に置くのが一般的です。これは、データ構造の最後のスタイルでうまく構成されます。


岡崎ビューの概要は、彼の Edison ライブラリ(これもまた別のデータ構造ライブラリ) に記載されています。

  • 部分適用: 静的である可能性が高い引数は、通常、部分適用を容易にするために他の引数の前に表示されます。
  • コレクションは最後に表示されます : 操作が単一のコレクションを照会するか、既存のコレクションを変更するすべての場合において、コレクション引数は最後に表示されます。これは、Haskell データ構造ライブラリのデファクト スタンダードのようなものであり、API にある程度の一貫性をもたらします。
  • 最も一般的な順序: 操作が複数のデータ構造でよく知られた数学関数を表す場合、引数は関数の最も一般的な引数の順序に一致するように選択されます。
于 2011-05-02T22:38:13.790 に答える
11

再利用する可能性が最も高い引数を最初に配置します。関数の引数は、この好例です。map f多くの異なる関数を同じリストにマップしたい場合よりも、2 つの異なるリストを使用したい場合の方がはるかに多いでしょう。

于 2011-05-02T22:35:56.940 に答える
3

私はあなたがしたことをする傾向があり、良いと思われる注文を選び、別の注文の方が良いことが判明した場合はリファクタリングします。順序は、関数を(当然のことながら)どのように使用するかによって大きく異なります。

于 2011-05-03T11:56:43.850 に答える