私は次のような問題があります。関数の数が少なく、それぞれの関数が少なくとも2つのパラメータ(それぞれの定義された型の1つ)を必要とする2つの型です。
これらのタイプはパラメータ化されており、ジェネリックタイプのパラメータが適合する場合にのみ、それらの関数で使用できます。fのスレッディング・パラメータ#
type Record<'a, 'b> = { first: 'a; second: 'b }
type Lens<'a, 'b> = Lens of 'a * 'b
let someFn lens rec : Record<'a, 'b> = ....
let anotherFn lens rec : Record<'a, 'b> = ...
let aThirdFn lens rec : Record<'a, 'b> = ...
//and potentially a dozen functions more that might or might not return a record
使用シナリオは、今すぐ任意のワークフローのためのレンズ型は同じままが、レコードは何らかの形で処理されている。この
let workflow1() =
let intIntLens = Lens (1, 1)
let intIntRec = { first = 10; second = 100}
intIntRec
|> someFn intIntLens
|> anotherFn intIntLens
|> aThirdFn intIntLens
let workflow2() =
let strIntLens = Lens ("foo", 1)
let strIntRec = { first = "bar"; second = 100}
strIntRec
|> someFn strIntLens
|> someFn strIntLens
|> aThirdFn strIntLens
|> anotherFn strIntLens
|> someFn strIntLens
のようなものです。 しかし私は何とか退屈なこれらの機能のそれぞれにレンズを通す必要があります。 明白なオプションの1つは、変更可能なモジュールレベル変数を持つことです。私は、並行コードにもかかわらず、ずっと長い間働いていないと思います。
ここで、レンズのパラメータを取り除く最良の方法は何ですか?