Шаблон стратегии в F #

В C # у меня есть следующий код:

public class SomeKindaWorker
{
    public double Work(Strategy strat)
    {
        int i = 4;
        // some code ...
        var s = strat.Step1(i);
        // some more code ...
        var d = strat.Step2(s);
        // yet more code ...
        return d;
    }
}

Это кусок кода, который может выполнять какую-то работу, используя предоставленную стратегиюобъект заполнить части реализации. Примечание: в общем случае объекты стратегии не содержат состояния; они просто полиморфно обеспечивают реализации отдельных шагов.

Класс стратегии выглядит так:

public abstract class Strategy
{
    public abstract string Step1(int i);
    public abstract double Step2(string s);
}

public class StrategyA : Strategy
{
    public override string Step1(int i) { return "whatever"; }
    public override double Step2(string s) { return 0.0; }
}

public class StrategyB : Strategy
{
    public override string Step1(int i) { return "something else"; }
    public override double Step2(string s) { return 4.5; }
}

наблюдение: Тот же эффект может быть достигнут в C # посредством использования лямбд (и вообще избавления от объекта стратегии), но приятной особенностью этой реализации является то, что расширяющие классы имеют свои реализации Step1 и Step2 вместе.

Вопрос: Какова идиоматическая реализация этой идеи в F #?

Мысли:

Я мог бы добавить отдельные ступенчатые функции в рабочую функцию, аналогично идее в наблюдении.

Я также мог бы создать тип, который собирает две функции, и передатьзначение этого типа через:

type Strategy = { Step1: int -> string; Step2: string -> double }
let strategyA = { Step1 = (fun i -> "whatever"); Step2 = fun s -> 0.0 }
let strategyB = { Step1 = (fun i -> "something else"); Step2 = fun s -> 4.5 }

Это похоже на самое близкое соответствие с тем, чего я пытаюсь достичь: он держит шаги реализации близко друг к другу, чтобы их можно было рассматривать как совокупность. Но является ли эта идея (создание типа, содержащей только значения функций) идиоматической в ​​функциональной парадигме? Есть еще мысли?

Ответы на вопрос(4)

Ваш ответ на вопрос