Я хотел бы получить код F #, который ведет себя так же, как и следующий код C #:
public abstract class ModelBase<TIn, TOut>
{
internal abstract Func<TIn, TOut> GetFuncInternal();
}
public class Model1 : ModelBase<Tuple<int, int>, int>
{
private int _val;
public Model1(int val)
{
_val = val;
}
internal override Func<Tuple<int, int>, int> GetFuncInternal()
{
return _ => _val;
}
}
public class Model2 : ModelBase<Tuple<int, double>, double>
{
private double _val;
public Model2(double val)
{
_val = val;
}
internal override Func<Tuple<int, double>, double> GetFuncInternal()
{
return _ => _val;
}
}
public class Model3 : ModelBase<int, bool>
{
internal override Func<int, bool> GetFuncInternal()
{
return _ => true;
}
}
public static class Helpers
{
public static Func<TIn, TOut> GetFunc<TIn, TOut>(ModelBase<TIn, TOut> model)
{
return model.GetFuncInternal();
}
}
Поэтому приведенный выше код можно использовать следующим образом:
var func1 = Helpers.GetFunc(new Model1(1));
var func2 = Helpers.GetFunc(new Model2(1.0));
var func3 = Helpers.GetFunc(new Model3());
Как вы можете видеть, тип GetFunc
результат зависит от типа его параметров.
В F # Модели определены как дискриминируемый союз:
type Model =
| Model1 of int
| Model2 of double
| Model3
И вопрос: как определить GetFunc
в F #?Мне нужно что-то подобное (конечно, следующий пример не скомпилирован из-за несоответствия типов при сопоставлении с образцом):
let GetFunc (m: Model) =
match m with
| Model1 i -> fun (x: int, y: int) -> i
| Model2 d -> fun (x: int, y: double) -> d
| Model3 -> fun (x: int) -> true