Как определить функцию, которая возвращает функцию с сигнатурой, зависящей от параметров - PullRequest
0 голосов
/ 20 ноября 2010

Я хотел бы получить код 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

1 Ответ

2 голосов
/ 20 ноября 2010

Не определяйте Model таким образом.На самом деле, трудно сказать, что вы делаете, но это пахнет как домен, где вам не нужно определять какие-либо типы.Просто используйте лямбды, и вам не нужен ни один из этих типов моделей.Что вы на самом деле пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...