Общий список F #, который содержит методы в качестве параметра метода ... Как написать сигнатуру метода в абстрактном типе - PullRequest
1 голос
/ 10 ноября 2011

Попытка выяснить, как создать метод, который принимает список методов и другой параметр. У меня есть метод, который я создал в C #, который я пытаюсь перенести на F #:

public interface IValidator
{
    MethodResult Validate(IList<Func<userModel, MethodResult>> validationMethods
      , userModeltoValidate);
}

Я пробовал что-то вроде:

type public IValidator =
  abstract Validate : IList<(BasicUserModel -> MethodResult<'a>)>, BasicUserModel 
    -> MethodResult<'a>

Но ему не нравится синтаксис, даже если я окружаю подпись параметра круглыми скобками. Конечная цель состоит в том, чтобы иметь метод, который принимает список методов и запускает их, просматривая список.

public MethodResult Validate(IList<Func<BasicUserModel, MethodResult>> validationMethods, 
   BasicUserModel toValidate)
{
   ...
}

Часть цикла, которую я могу легко получить с помощью F #, это синтаксис сигнатуры метода как для абстрактного типа, так и для типа, реализующего метод, который убивает меня.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

В объявлении абстрактного метода вместо разделения типов аргументов запятыми их следует разделять звездочками, как если бы метод принимал кортеж:

abstract Validate : IList<(BasicUserModel -> MethodResult<'a>)> * BasicUserModel 
                         -> MethodResult<'a>  

Вот еще несколько мыслей:

  1. Типы являются общедоступными по умолчанию, поэтому вы можете опустить ключевое слово public в объявлении типа.
  2. Было бы более идиоматичным (и более гибким для вызывающих абонентов) взять seq<_>, чем IList<_>, если только вам не нужен произвольный доступ, а не зацикливание.
  3. Я предполагаю, что это преднамеренно, но ваш метод проверки F # будет универсальным (так как он возвращает MethodResult<'a>, используя необъявленный параметр типа 'a). Если вы хотите использовать неуниверсальный метод для универсального типа, добавьте параметр 'a в объявление типа: type IValidator<'a> = ....
1 голос
/ 10 ноября 2011

F # эквивалент

public MethodResult Validate(
   IList<Func<BasicUserModel, MethodResult>> validationMethods, 
   BasicUserModel toValidate) {
   ...
}

равен

member this.Validate
   (validationMethods : IList<(BasicUserModel -> MethodResult)>, 
    toValidate : BasicUserModel) = ...

Единственное отличие заключается в том, что версия F # принимает IList FSharpFunc (что более идиоматично) по сравнению с Func в C #.

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