[解決済み] キュアリングを利用するためのパラメータの順序付け
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にある程度の一貫性を持たせるものです。
- 最も一般的な順序 : 操作が複数のデータ構造上のよく知られた数学的関数を表す場合、引数はその関数の最も一般的な引数順序に一致するように選択されます。
関連
-
[解決済み] キュアリング」とは何ですか?
-
[解決済み] キュアリングと部分適用の違いは何ですか?
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?
-
[解決済み] HaskellとF#の主な違いは何ですか?[クローズド]
-
[解決済み] Haskell型とデータコンストラクタ
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] Haskell エラー 入力 `=' のパースエラー
-
[解決済み] 型チェッカーは非常に間違った型置換を許可しているが、プログラムはまだコンパイルできる
-
[解決済み] fixの使い方、効果について教えてください。
-
[解決済み] Haskellには末尾再帰的最適化があるか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Haskell - Ord aの型は何を意味するのでしょうか?
-
[解決済み】キーを含むPHPのarray_map
-
[解決済み] ghciで関数を複数行に渡って定義するには?
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み] なぜ依存型でないのか?
-
[解決済み] Haskellのマルチコアプログラミングはどうなっているのか?
-
[解決済み] HaskellとF#の主な違いは何ですか?[クローズド]
-
[解決済み] 無限リストでのfoldlとfoldrの動作
-
[解決済み] Haskellの「何もしない」関数、idはなぜ大量のメモリを消費するのか?
-
[解決済み] Haskellの合成演算子(.)とF#のパイプ転送演算子(|>)の比較