Как использовать "struct" с каррингом "Func"? - PullRequest
0 голосов
/ 28 декабря 2018

«Карри» меня очень интересует, поэтому я пытаюсь включить его в C # «Func».Есть простое упражнение, чтобы прочитать несколько положительных значений, затем сложить, посчитать и усреднить этот ряд.Следующий список является 1-й пробной версией:

Func<int, Func<int, int>> CurriedSum = x => y => x + y;//Declare curryied sum
Func<int, int> CurriedCount = x => x + 1;//Declare counting
Console.Write("Please input the first number in a series: ");//Prompt
int inputValue = int.Parse(Console.ReadLine());//User's input
int sum = inputValue;//original sum = 1st value
int count = CurriedCount(0);//count from 0
do
{
    Console.Write("Please input the next number in a series (0 will exit):");//Prompt
    inputValue = int.Parse(Console.ReadLine());//User's input
    if (inputValue > 0)//Accept positive number only
    {
        sum = CurriedSum(inputValue)(sum);//Call curried function to sum
        count = CurriedCount(count);//Call function to count
        Console.Write($"=> Sum of {count} numbers is {sum}.");//Output
        Console.WriteLine($" Mean is {(float)resultInt/count}.");//Output
    }
} while (inputValue > 0);//loop until 0 or any negative number

Эта пробная версия работает.Однако следующее 2-е испытание завершается неудачно:

internal struct MyStruct
{
    public int Sum;
    public int Count;
    public float Mean;
}//located above static void Main(string[] args)

//Func<int, Func<int, MyStruct>> CurriedSumMean = x => y =>//wrong
Func<int, Func<MyStruct, MyStruct>> CurriedSumMean = x => y =>//*correct*
{
    MyStruct result;//no need to initialize
    //result.Sum = x + y;//wrong
    //result.Count++;//Error here!
    result.Sum = x + y.Sum;//*correct*
    result.Count = y.Count + 1;//*correct*
    result.Mean = result.Sum / result.Count;
    return result;
};//Calculate and return curried sum, counting and average
MyStruct series;//Declare a series
Console.Write("Please input the first number in a series: ");//Prompt
inputValue = int.Parse(Console.ReadLine());//User's input
series.Sum = inputValue;//original sum = 1st value
series.Count = 1;//count from 1
series.Mean = inputValue;//original average = 1st value
do
{
    Console.Write("Please input the next number in a series (0 will exit):");//Prompt
    inputValue = int.Parse(Console.ReadLine());//User's input
    if (inputValue > 0)//Accept positive number only
    {
        series = CurriedSumMean(inputValue)(series);//*it works!*
        Console.Write($"=> Sum of {series.Count} numbers is {series.Sum}.");//Output
        Console.WriteLine($" Mean is {series.Mean}.");//Output
    }
} while (inputValue > 0);//loop until 0 or any negative number

В Visual Studio 2017 обнаружены две ошибки. Одна из них - result.Count ++;определенная в функции карри функция CurriedSumMean.Другая ошибка: series = CurriedSumMean (inputValue) (series).

Как правильно использовать и struct, и Func, особенно каррирование?Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 28 декабря 2018

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

MyStruct result = new MyStruct();

Вы не можете преобразовать объект структуры в целое число.Я полагаю, вы должны использовать серии. Сумма здесь

series = CurriedSumMean(inputValue)(series.Sum);
...