2016-11-07 2 views
2

Ich habe eine einfache Funktion, die jeden Primfaktor einer gegebenen Eingangsnummer auflistet. Es besteht aus:Verschachtelte Funktionen in F #

let rec f n x a = 
    if x = n then 
     x::a 
    elif n % x = 0 then 
     f (n/x) x (x::a) 
    else 
     f n (x+1) a 

let fact n = f n 2 [] 

fact 315 
val factors : int list = [7; 5; 3; 3] 

Es funktioniert, aber ich möchte es eine einzige Funktion machen: Wie kann ich definieren fact mit f in direkt verschachtelt? Ich habe versucht, das brillant ausgedrückte Konzept here anzuwenden, aber ich kann nicht abstrahieren, wie man eine Drei-Argument-Funktion (f) in einem Argument (fact) verschachtelt.

+3

'fun' kann nicht als Bezeichner in F # verwendet werden, da es ein sehr häufiges Stichwort ist. – TeaDrivenDev

+2

Dies wird nicht einmal kompiliert. Zuerst ist 'Spaß' ein Schlüsselwort. Zweitens, woher kommen 'f' und' a'? – nphx

+1

'f' ist wahrscheinlich das selbe wie' fun'. – TeaDrivenDev

Antwort

6
  1. Verschieben Sie den Funktionskörper von fact in eine neue Zeile. Stellen Sie sicher, dass es eingerückt ist.
  2. Fügen Sie eine leere Zeile zwischen der Deklaration fact und dem soeben verschobenen Funktionskörper hinzu.
  3. Cut die gesamte Definition von fun und Paste es in die leere Zeile, die Sie im zweiten Schritt erstellt.
  4. einrücken kopierten Code, so dass es eine lokale Funktion von fact.
1

Alles, was Sie tun müssen, werden wird, um die rekursive Funktion f innerhalb fact zu bewegen, und dann rufen. Es wird um die Parameter zu fact weitergegeben verwenden:

let fact n = 
    let rec f n x a = 
     if x = n then 
      x::a 
     elif n % x = 0 then 
      f (n/x) x (x::a) 
     else 
      f n (x+1) a 
    f n 2 [] 

fact 315 
//val it : int list = [7; 5; 3; 3] 
Verwandte Themen