11

私は Haskell でScrap Your Boilerplateという興味深いライブラリを見つけました。これはSimon Peyton Jonesの論文に基づいており、関数型プログラミング言語で大規模で深くネストされたデータ構造を更新できるコードを効率的に作成する方法のようです。次のようなコードを有効にします。

incS :: Float -> Salary -> Salary
incS k (S s) = S (s * (1+k))

increase :: Float -> Company -> Company
increase k = everywhere (mkT (incS k))

これにより、大規模で複雑になる可能性のある会社のデータ構造内のすべての人に対して、一定の割合 k で給与が効果的に増加します。

Clojure で同じ種類のプログラミング スタイルを実現する同等のライブラリまたはアプローチはありますか?

たとえば、上で使用した例に相当する Clojure をどのように記述すればよいでしょうか。

(defn increase [company k]
  (everywhere-in company (transform-map-values :salary #(* % (+ 1 k))))
4

2 に答える 2

4

Clojure でこれに最も近いのは、おそらく "in" 関数 (assoc-in、update-in、dissoc-in) です。

これらの関数を使用すると、clojure で深くネストされた正確な変更を行うことができます。これらの関数は動的型付けに大きく依存しているため、Haskell にはこれらの関数に相当するものはありません。

于 2011-09-12T15:41:23.560 に答える
1

この質問が最初に尋ねられたとき、それらは存在していませんでしたが、トランスデューサーは同様のスタイルのプログラミングを可能にすると信じています。基本的に、変換可能なプロセスは特定の機能セットを実装しており、トランスデューサーはこれらの機能を使用して任意の変換可能なプロセスをトラバースできます。

于 2015-01-30T21:04:18.840 に答える