Padrão de estratégia em F #
Em C #, tenho o seguinte código:
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;
}
}
Este é um pedaço de código que pode fazer algum tipo de trabalho usando uma estratégia fornecidaobjeto para preencher partes da implementação. Nota: em geral, os objetos de estratégia não contêm estado; eles meramente fornecem polimorficamente implementações de etapas individuais.
A classe de estratégia é assim:
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; }
}
Observação: O mesmo efeito pode ser alcançado em C # através do uso de lambdas (e da eliminação completa do objeto de estratégia), mas o bom dessa implementação é que as classes estendidas têm suas implementações Step1 e Step2 juntas.
Pergunta, questão: O que é uma implementação idiomática dessa idéia em F #?
Pensamentos:
Eu poderia injetar funções de etapa individuais na função Trabalho, semelhante à idéia na observação.
Eu também poderia criar um tipo que colete duas funções e passe umvalor desse tipo através de:
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 }
Essa parece ser a correspondência mais próxima do que estou tentando alcançar: mantém as etapas de implementação próximas para que possam ser examinadas em conjunto. Mas essa idéia (criando um tipo para conter apenas valores de função) é idiomática no paradigma funcional? Algum outro pensamento?