如何将 "struct" 与柯里化 "Func" 一起使用?
How to use "struct" with currying "Func"?
"Curry" 我很感兴趣,所以我尝试将它合并到 C# "Func" 中。
有一个简单的练习可以读取一些正值,然后对这个系列进行求和、计数和平均。以下列表为第一次试用:
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
这个试用版有效。但是,以下第二次试验失败了:
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
2017年Visual Studio发现两个错误,一个是result.Count++;定义在柯里化函数函数内的 CurriedSumMean。另一个错误是 series = CurriedSumMean(inputValue)(series).
如何正确使用 "struct" 和 "Func",尤其是柯里化?
非常感谢您的帮助。
您必须在使用前初始化对象
MyStruct result = new MyStruct();
您不能将结构对象转换为整数。我想你应该在这里使用 series.Sum
series = CurriedSumMean(inputValue)(series.Sum);
"Curry" 我很感兴趣,所以我尝试将它合并到 C# "Func" 中。 有一个简单的练习可以读取一些正值,然后对这个系列进行求和、计数和平均。以下列表为第一次试用:
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
这个试用版有效。但是,以下第二次试验失败了:
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
2017年Visual Studio发现两个错误,一个是result.Count++;定义在柯里化函数函数内的 CurriedSumMean。另一个错误是 series = CurriedSumMean(inputValue)(series).
如何正确使用 "struct" 和 "Func",尤其是柯里化? 非常感谢您的帮助。
您必须在使用前初始化对象
MyStruct result = new MyStruct();
您不能将结构对象转换为整数。我想你应该在这里使用 series.Sum
series = CurriedSumMean(inputValue)(series.Sum);