2016-03-28 12 views
2

私はF#*のオイラーを試していて、現在#5にいます。私の問題は、パイプライン操作で複数のパラメータを取る関数を使用している。パイプラインに2つの変数を渡す

この機能が正しく最初のパラメータが二番目のパラメータである配列の全ての要素で割り切れるかどうかを返します。

let isDivisibleBy seq n = 
    seq 
    |> Seq.forall (fun x -> n % x = 0) 

isDivisibleBy [|1 .. 10|] 2520 //true 

ただし、次の文は動作しません:

Seq.initInfinite 
    |> Seq.find isDivisibleBy [|1 .. 10|] 

私は次のエラーが表示されます。

error FS0001: The type '((int -> 'c) -> seq<'c>) -> 'd' is not compatible with the type 'seq<'a>'

*「2520は最小の麻痺です1〜10の各数値で剰余を除算することができます。 1から20までの数字の全てで割り切れる最小の正の数はどのくらいです「

答えて

5

短い答え:?。あなたは括弧とSeq.initInfiniteの最初の引数が欠落している

正しいコード:

Seq.initInfininte id 
|> Seq.find (isDivisibleBy [|1..10|]) 

説明

表現 Seq.find isDivisibleBy [|1 .. 10|]次の2つの引数を持つ関数を呼び出す Seq.findしようとしているで

isDivisibleByおよび[|1 .. 10|]。そして、パイプ(|>)演算子の第2引数として結果の値を使用しようとしています。あなたのコードはこれと同じです(それぞれの呼び出しを別々のステップにするだけです)。明らかに間違っているのは明らかです。あなたのコードの残りの部分から

は、私はあなたがおそらくやりたいことのように、部分的に引数 [|1 .. 10|]に機能 isDivisibleByを適用し、 Seq.findに結果の値を渡すためにあったことを推測する:

let b = isDivisibleBy [|1 .. 10|] 
let a = Seq.find b 
Seq.initInfinite |> a 

let b = isDivisibleBy [|1 .. 10|] 
let a = Seq.find b 
let c = Seq.initInfinite (fun x -> x) 
c |> a 

再: - 、生成されたシーケンスの要素に関数マッピング・インデックス - しかし、あなたは引数を提供しないSeq.initInfiniteは一つの引数を取りますので、しかし、これはまだ、コンパイルされません

Seq.initInfininte id 
|> Seq.find (isDivisibleBy [|1..10|]) 
+0

おかげで、フョードル:上記のコードから中間let Sを移動し、idで冗長ラムダfun x -> xを交換し、我々は最終的に答えを得ます。また、initInfiniteで私のエラーに気付くために+1。 –

+3

最小*正数*を見つけるには、 'id'を'((+)1) 'に置き換える必要があります。 – CaringDev

関連する問題