Шаблон стратегии в 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 }
Это похоже на самое близкое соответствие с тем, чего я пытаюсь достичь: он держит шаги реализации близко друг к другу, чтобы их можно было рассматривать как совокупность. Но является ли эта идея (создание типа, содержащей только значения функций) идиоматической в функциональной парадигме? Есть еще мысли?