Функцияларды анықтайтын жанама функциялары қандай?

Егер сізде басқа функцияға сүйенетін рекурсивті функция болса, оны іске асырудың қолайлы жолы қандай?

1) рекурсивті функциядан тыс

let doSomething n = ...
let rec doSomethingElse x =
    match x with
    | yourDone -> ...
    | yourNotDone -> doSomethingElse (doSomething x)

2) рекурсивті функцияның ішінде

let rec doSomethingElse x =
    let doSomething n = ...
    match x with
    | yourDone -> ...
    | yourNotDone -> doSomethingElse (doSomething x)

3) үшінші функцияның ішінде де инкапсулировать

let doSomethingElse x =
    let doSomething n = ...
    let innerDoSomethingElse =
        match x with
        | yourDone -> ...
        | yourNotDone -> innerDoSomethingElse (doSomething x)

4) одан да жақсы нәрсе?

6
Неліктен жақын дауыс? Бұл өте жақсы/ақылға қонымды мәселе сияқты көрінеді.
қосылды автор Daniel, көзі

1 жауаптар

module Test =

    let f x = 
      let add a b = a + b //inner function
      add x 1

    let f2 x =
      let add a = a + x //inner function with capture, i.e., closure
      add x

    let outerAdd a b = a + b

    let f3 x =
      outerAdd x 1

Аударады:

[CompilationMapping(SourceConstructFlags.Module)]
public static class Test {

    public static int f(int x) {
        FSharpFunc> add = new [email protected]();
        return FSharpFunc.InvokeFast(add, x, 1);
    }

    public static int f2(int x) {
        FSharpFunc add = new [email protected](x);
        return add.Invoke(x);
    }

    public static int f3(int x) {
        return outerAdd(x, 1);
    }

    [CompilationArgumentCounts(new int[] { 1, 1 })]
    public static int outerAdd(int a, int b) {
        return (a + b);
    }

    [Serializable]
    internal class [email protected] : OptimizedClosures.FSharpFunc {
        internal [email protected]() { }

        public override int Invoke(int a, int b) {
            return (a + b);
        }
    }

    [Serializable]
    internal class [email protected] : FSharpFunc {
        public int x;

        internal [email protected](int x) {
            this.x = x;
        }

        public override int Invoke(int a) {
            return (a + this.x);
        }
    }
}

Ішкі функцияның жалғыз қосымша құны - FSharpFunc данасын жаңартып отыру - елеусіз болып көрінеді.

Егер сіз өте болсаңыз, өнімділікке сезімтал болмасаңыз, ең мағыналы, яғни ең тар ауқымға ие болатын көлеммен айналысамын.

5
қосылды
Соңғы сөйлемді қараңыз. Мен оны салыстыруға уақыт жоқ, бірақ мен айтарлықтай айырмашылықты атап өтті.
қосылды автор Daniel, көзі
Жауапты үзінділеріңізден алуға болмайды, бірақ оны шынымен де жазу керек.
қосылды автор Ramon Snir, көзі
FSharpFunc жасау ауыр кодты пайдалану үшін өнімділіктің бұзылуына әкелуі мүмкін, бірақ көп жағдайда бұл маңызды емес.
қосылды автор Ramon Snir, көзі