関数型言語のUIパターン


11

ClojureScriptをいじり始めたいのですが、いくつかの点に困惑しています。私の問題は、機能的に作業しようとするときに、ユーザーの対話から生じる状態の変化に対処するための良い方法です。

いくつか例を挙げましょう。ブラウザーで実行されるアプリケーションを念頭に置いていますが、問題はより一般的だと思います。もちろん、何かが変化します-少なくともDOMです。しかし、不変のデータ構造で動作するように残りのコードを整理する方法を見つけたいと思います。

1)イベントをDOMオブジェクトに添付したいとします。これは主に機能的な方法で行うのは難しくありません。ノードを作成するときに、さまざまなイベントハンドラーでハッシュマップをアタッチします。ただし、イベントの委任を使用している場合を考えてください。次に、新しいノードを作成するときに、おそらく既に存在する親ノードにイベントハンドラーをアタッチできます。そのため、既存のノードに関連付けられているハッシュを変更する必要があります。

2)入力フィールド用のオートコンプリートモジュールを設計しているとします。ユーザーがキーを押すたびに、提案を得るためにサーバーを呼び出すことができます。これは簡単です。しかし、今それを少し最適化したいと思います。一致するすべての結果fooがわかっている場合は、一致するすべての結果を再度要求しても意味がありませんfoobar。前者をフィルタリングできます。そのため、何らかのキャッシュを作成する必要があります。このキャッシュは、ユーザーが以前に入力した単語のスーパーセットではない新しい単語を挿入するたびに更新されます。繰り返しますが、キャッシュをどのようにモデル化するのですか?最も合理的な方法は、単語を結果にマッピングするハッシュマップのようですが、変更可能である必要があります。

ユーザーの操作による変更を機能設計に組み込むのを容易にするいくつかのパターンを提案できますか?


4
「機能的リアクティブプログラミング」を検索します。
dan_waterworth

これはまったく同じことではありませんが、ユーザーによって開始されたDOMイベントに一致する(副作用なしの)XSLTテンプレートでは、Saxon-CEで同様の問題に直面します。私が見たいのは、XSLTではなく、ユーザーが状態の変化をトリガーしているということです。重要なのは、ユーザーとのやり取りを管理するコードと、その後の状態の変化を他のコードから非常に分離させることです。
pgfearo

@pgfearoユーザー操作が他の操作と十分に分離されるようにコードを編成する方法についてアドバイスはありますか?
アンドレア

関数型プログラミングはステートレスであるため、機能的に作業しているときに状態の変化に対処する良い方法はありません。
古いプロ

3
@Old Pro:これは完全に正しいわけではありません。関数型プログラミングでは、副作用の代わりに関数アプリケーションを使用して計算を定義しますが、最終的には計算の結果をどこかに保存する必要があります。FPの焦点は、状態の使用を最小限に制限することにありますが、命令型プログラミングでは、状態を段階的に(副作用により)変換することが、計算を定義するための基本ツールです。
ジョルジオ

回答:


3

コメントで述べたように、「関数型リアクティブプログラミング」を調べる必要があります。また、http://prog21.dadgum.com/archives.htmlの投稿の一部も読む必要があります。より具体的には、「技術に恋をしないでください」、「プログラミングの方法を学んだばかりのコードを書く」、「関数型プログラミングが機能しない(およびそれについてどうするか)」、そしておそらく他のいくつかのもの。

可変性と副作用を完全に回避することは事実上不可能です。HaskellプログラマでさえunsafePerformIO、特定のことを行うために、純粋に機能的で副作用のない静的に型付けされたパラダイムから抜け出すために時々利用するでしょう。純粋にアカデミックなエクササイズとしてこのプロジェクトに着手する場合は、できるだけ先に進み、可能な限り可変性と副作用を避けてください。ただし、期限内に使用可能な製品を構築しようとする場合、パターンはあなたを救いません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.