Dea*_*ats 3 c# functional-programming
我正在尝试使用 language.ext (C#) 库作为起点来了解更多关于函数式编程的知识。我正在尝试使用Either monad,但我遗漏了一些东西。看一个简单的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dates
{
public class AssignmentDate
{
public static Either<string, AssignmentDate> Create(DateTime date)
{
if (date < MinValue)
return Left<string, AssignmentDate>("date out of range");
return Right<string, AssignmentDate>(date);
}
public static DateTime MinValue => new DateTime(1950, 1, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
类型 Left<> 和 Right<> 无法解析。我显然错过了一些东西,但是什么?我是否正确使用Either<>?这是使用Either<>时正确的返回方式吗?谁能指出更多关于language.ext 的例子?非常感谢您提供的任何帮助。
我是 Language-Ext 的作者。 Left和Right是构造函数,而不是本身的类型,它们都构造一个Either<L, R>. 许多类型在静态类中有构造函数Prelude,这就是为什么你需要using static在它上面做。它不是命名空间,而是一个类。
你可以写: Prelude.Left<L, R>(...)和Prelude.Right<L, R>(...)。
这是为了模拟 F# 等函数式语言中的代数数据类型 (ADT),Either可以像这样定义:
type Either<'l, 'r> =
| Left of l
| Right of r
Run Code Online (Sandbox Code Playgroud)
这将允许您构建Either这样的:Right(x).
其他构造函数有:Some(x)and Nonefor Option、List(x,y,z)for Lst、 Set(x,y,x)forSet等。
的Prelude类可以很容易地包括一吨的碱官能团与一种using static,而不是做using static LanguageExt.Either,using static LanguageExt.Option等
顺便说一句,编写示例的一种更实用的方法是:
public static Either<string, AssignmentDate> Create(DateTime date) =>
date < MinValue
? Left<string, AssignmentDate>("date out of range")
: Right<string, AssignmentDate>(date);
Run Code Online (Sandbox Code Playgroud)
原因是三元运算符是一个表达式,而您使用多个语句来获取结果。如果你正在学习函数式编程,你应该总是尽可能地尝试使用表达式。例外情况是您需要声明局部变量,但大多数情况下您可以在 C# 中编写纯表达式。如果您的表达式变得太大,请将它们分解为更小的函数。函数式编程的一个副作用是你的函数会变得越来越小;有时只有单行事务。