現在、いくつかのエクササイズをexercism.ioから行っています。 1つのエクササイズは、シーケンス内のすべての数字を合計し、異なるシーケンスからの1つ以上の数字の倍数です。小さな機能に問題を分割することは良いアイデアのように思えたし、私はこの思い付いた:パラメータの順序を変更しないようにする方法
let multipleOf m n =
n % m = 0
let anyMultipleOf (m: int list) n =
m
|> Seq.exists (multipleOf n)
let sumOfMultiples m n =
[1..n-1]
|> Seq.filter (anyMultipleOf m)
|> Seq.sum
アイデアので、私は私の(any)multipleOf
関数にm
パラメータ「で焼く」する部分のアプリケーションを使用することができます。しかし、Seq.exists (multipleOf n)
は実際にn
を私のm
パラメータとして適用しているので、このコードは私が望むようには機能しません。
multipleOf
関数のパラメータの順序を逆にする必要なくこのコードをリファクタリングするにはどうすればよいですか?
注:私は私のanyMultipleOf
関数の中で私のmultipleOf
機能を使用するソリューションを求めています。このソリューションは動作しますが、私の最初の関数を再利用していない:
let anyMultipleOf (m: int list) n =
m
|> Seq.exists (fun x -> n % x = 0)
'multipleOf'と' anyMultipleOf'の両方が実際には逆の順序でパラメータを持つべきです。パラメータは、より一般的なものからより具体的なものへと定義される。 '(any)MultipleOf x'を現在の方法よりも再利用することがポイントです。 – Sehnsucht
私の思考プロセスはまったく逆でした。 'let anyMultipleOfMyNumbers = anyMultipleOf [3; 5; 7]' –
これもうまくいきます: 'let filterMultiplesOf5 numlist = numlist |> Seq.filter(multipleOf 5)' –