2016-03-28 11 views
2

Ich habe versucht die Eulers in F # * und bin derzeit auf # 5. Mein Problem ist die Verwendung einer Funktion, die mehr als einen Parameter in einer Pipelineoperation benötigt.Übergeben von zwei Variablen in die Pipeline

Diese Funktion gibt richtig, ob den ersten Parameter, der von jedem Elemente eines Arrays teilbar ist, die der zweite Parameter ist:

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

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

jedoch die folgende Erklärung nicht funktioniert:

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

I den folgenden Fehler erhalten:

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

* "2520 ist die kleinste taub Das kann durch jede der Zahlen von 1 bis 10 ohne Rest geteilt werden. Was ist die kleinste positive Zahl, die durch alle Zahlen von 1 bis 20 teilbar ist „

Antwort

5

Kurze Antwort:?.

Du fehlst Klammern und erstes Argument von Seq.initInfinite Korrekter Code:

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

Erklärung

In Ausdruck Seq.find isDivisibleBy [|1 .. 10|] Sie versuchen Funktion Seq.find mit zwei Argumenten zu nennen, isDivisibleBy und [|1 .. 10|]. Und dann versuchen Sie, den resultierenden Wert als zweites Argument des Pipe-Operators (|>) zu verwenden. Ihr Code entspricht diesem (machen Sie einfach jeden Anruf zu einem separaten Schritt):

Das ist offensichtlich falsch.

Vom Rest des Codes, schließe ich das, was Sie wahrscheinlich teilweise anwenden sollte, um die Funktion isDivisibleBy zu Argumente [|1 .. 10|], und dann übergeben Sie den resultierenden Wert zu Seq.find, wie dies tun wollten:

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

aber das wird noch nicht kompilieren, weil Seq.initInfinite ein Argument - eine Funktionszuordnung Indizes Elemente der erzeugten Sequenz, - aber sie bieten keine Argumente:

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

Re Zwischen let s aus dem obigen Code zu bewegen und das redundante Lambda fun x -> x mit id ersetzen, erhalten wir die endgültige Antwort:

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

Danke, Fyodor. Auch +1, um meinen Fehler mit initInfinite zu bemerken. –

+3

Um die kleinste * positive * Zahl zu finden, müssen Sie 'id' durch' ((+) 1) 'ersetzen – CaringDev

Verwandte Themen