C Pottinger Ответов: 1

Лексическая разбивка приложения частичной функции


Здравствуйте гуру,

Во-первых, я повторно отправляю этот вопрос из-за недоразумения, возникшего у меня по поводу входа в проект кода. Приношу свои извинения за любую путаницу, которую это может вызвать.

В предыдущий пост У меня была проблема, которая была аккуратно решена с помощью приложений частичных функций. Теперь у меня есть проблема, но не с кодированием решения, а с попыткой понять синтаксис решения.

Фон:
Я определил набор функций, которые я использую для проверки данных. Вот такой пример
Func<int, Func<object, string>> MaxLen => max => value => CheckLength(value, max);

который я использую в словаре, определяющем правила для различных полей данных в файле:
_rules = новые Файлеры()
{
{ "FH03", new FieldRules() { буквенно-цифровой, MaxLen(10), ... } },
{ "FH04", new FieldRules() { буквенно-цифровой, MaxLen(30), ... } },
...
};
Я использую его вот так
object validated = stuffToOutput;
try
{
    foreach (var rule in _rules[fieldId])
    {
        validated = rule(validated);
    }
}
catch (Exception ex) { ... }

Это позволяет мне передать данные для поля FH03 и проверить его, чтобы убедиться, что оно является буквенно-цифровым и имеет максимальную длину 10 символов и т. д. Этот код прекрасно работает, и я понимаю, как он работает. Моя проблема в том, что я изо всех сил пытаюсь объяснить другим, как это работает. В частности, правильная терминология, используемая для описания определения приложения частичной функции в синтаксисе, который я использую.

Проблема:
Эта страница указывает, что лямбда-выражения интерпретируются как параметры слева от => и выражения справа. С этим
value => CheckLength(value, max)

легко объясняется как лямбда, которая принимает параметр, называемый ценность и возвращает результат Контрольная длина(значение, макс.).
max => value => CheckLength(value, max)

объясняется как лямбда, которая принимает параметр, называемый максимум и возвращает результат агнцапапа справа.

Но потом я добираюсь до
Func<int, Func<object, string>> MaxLen => max => value => CheckLength(value, max)

Что такое в лексиконе C# Аналогичная?

Это не так. параметр - его использование в первом блоке кода (где определены словарные статьи) несовместимо с тем, что он является параметром.

Я подумал, что было бы разумно сказать, что это имя a им делегировать, но он не соответствует синтаксической сигнатуре любых типов делегатов, показанных на эта страница MS Все эти примеры показывают, что
Delegate delegatename = delegatedefinition;

Здесь нет = в синтаксисе, который я использую.

Даже эта ссылка, который показывает тип делегата действия, используемый с лямбда-выражением в качестве определения, использует синтаксис
Action delegatename = parms => lambda-expression;


Является Аналогичная один Функция- Опять ? эта запись показывает, что функции также выражаются равными знаками
Func funcname = parms => lambda-expression;

Опять же, в моем нет знака равенства.

Итак, как бы я сказал, что именно Аналогичная есть? Какова правильная терминология для его описания?

Что я уже пробовал:

Ломаю себе голову
Чистящий МС-сайты для терминологии

1 Ответов

Рейтинг:
8

Graeme_Grant

Это свойство доступно только для чтения. Вы могли бы переписать его вот так:

Func<int, Func<object, string>> MaxLen { get; } = max => value => CheckLength(value, max);


C Pottinger

Спасибо, Грэм. Это вполне логично, как я сейчас выгляжу.