2016-11-07 5 views
2

У меня есть простая функция, которая перечисляет каждый простой коэффициент заданного входного числа. Он состоит из:Вложенные функции в 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] 

Это работает, но я хотел бы сделать из нее одну функцию: как я могу определить fact с f непосредственно вложен в? Я попытался применить концепцию, блестяще выраженную here, но я не могу отвлечься, как вложить три аргумента функции (f) в один аргумент один (fact).

+3

'fun' не может быть использован в качестве идентификатора в F #, так как это очень общее ключевое слово. – TeaDrivenDev

+2

Это даже не компилируется. Во-первых, 'fun' является ключевым словом. Во-вторых, откуда берутся 'f' и' a'? – nphx

+1

'f', вероятно, то же самое, что и' fun'. – TeaDrivenDev

ответ

6
  1. Переместить функциональный корпус fact в новую строку. Убедитесь, что он имеет отступы.
  2. Добавьте пустую строку между объявлением fact и телом функции, который вы только что переместили.
  3. Cut все определение fun и паста его в пустую строку, созданную на втором этапе.
  4. Отступ скопированный код так, чтобы она стала локальной функцией fact.
1

Все что вам нужно сделать, это переместить рекурсивную функцию f в пределах fact, а затем вызвать его. Он будет использовать параметры, передаваемые fact:

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] 
Смежные вопросы