3

私は高度な関数型プログラミングのアイデアのいくつか、特に、不変データの操作方法については初めてです。多くの場合、データ構造は複合であり、より小さなデータ構造で構成されています。たとえば、世帯のすべてのメンバーで構成される家族コレクションがあるとします。家族を構築するかもしれません:

var flintstones = new Family().
    add(new Member({name: 'Fred'})).    //returns new instance of family 
    add(new Member({name: 'Wilma'}).    // "
    add(new Member({name: 'Pebbles'})); // "
var fred = flintstones.get({name: 'Fred'}).set({lname: 'Flintstone'});
flintstones = fred.family(); //new instance of family with latest fred.

fred変更しても実際には変更されないことに注意してくださいflintstones。への新しい参照を取得できますflintstonesが、何の目的でしょうか? すべてのオブジェクトは単なるスナップショットであるため、参照を保持する意味がわかりません。状態の変更は抽象化されているため、Observer パターンは使用しません。したがって、状態の変化を気にする GUI などの依存関係はどのように処理されるのでしょうか? 同期を維持するための観察に代わる機能的な方法は何ですか? 私は、オブジェクト自体が自分自身をレンダリングすることにビジネスを持っているとは考えていません。機能的なプログラムは、単一ページの Web アプリケーション GUI の状態を同期させるにはどうすればよいでしょうか?

Rich Hickey の講演は、私が関数型プログラミングを探求するきっかけになりました。私は彼の概念を理解していますが、実用的な実装 (JavaScript で) にジャンプするのに苦労しています。

4

1 に答える 1

2

あなたの例では、Family不変であるはずです。そのため、 を呼び出すたびaddに、既存のオブジェクトの内容 (それ自体は不変であるため、コピーしても問題ありません) に加えて、新しいものに基づいたまったく新しいオブジェクトを返す必要があります。同様に、setあなたが電話をかけたFred人は、Fred に基づいたまったく新しい家族のメンバーを返す必要がありますが、姓は異なります。(そのため中のオリジナルのフレッドFlintstonesは一切変更しておりません。)

この関数型スタイルの利点は、一度オブジェクトへの参照を取得すると、それが変更されないことがわかっていることです。構築時に有効だった場合は、有効かどうかを確認し続ける必要はありません。内部コピーが変更されないように、最初にオブジェクトを複製することなく、オブジェクトをコードから渡すことができます。

関数型プログラミングについてさらに学びたい場合は、Haskell や F# などの純粋に関数型の言語を試した方がよいでしょう。JavaScript で関数型プログラミングを行おうとすると、混乱する可能性があります。

于 2013-04-12T20:39:18.643 に答える