开始使用 language.ext(函数式 C#)

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 的例子?非常感谢您提供的任何帮助。

lou*_*ter 5

我是 Language-Ext 的作者。 LeftRight是构造函数,而不是本身的类型,它们都构造一个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 OptionList(x,y,z)for LstSet(x,y,x)forSet等。

Prelude类可以很容易地包括一吨的碱官能团与一种using static,而不是做using static LanguageExt.Eitherusing 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# 中编写纯表达式。如果您的表达式变得太大,请将它们分解为更小的函数。函数式编程的一个副作用是你的函数会变得越来越小;有时只有单行事务。

  • 非常感谢您花时间写答案。对此,我真的非常感激。一段时间以来,我一直在尝试学习函数式编程,而我的问题部分是因为我试图将我在“C# 中的函数式编程”中阅读的内容转换为您对库的期望取得了。我通常在晚上 11:30 尝试这样做也无济于事......最终这是我希望能够在工作中应用的东西,但看起来我还有很长的路要走。 (3认同)