2017-04-26 257 views
2

我想了解更多关于函数式编程,使用language.ext(C#)库作为起点。我正在尝试使用任一monad,但有一些我错过了。见一个简单的例子:开始与language.ext(功能C#)

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); 
    } 
} 

左<类型>和右<>无法解析。我明显错过了一些东西,但是什么?我正确使用<>吗?这是使用Either <>时返回的正确方法吗?任何人都可以指向language.ext的更多例子吗?非常感谢您提供的任何帮助。

+1

您需要导入包含的名称空间,并使用'new Left <...>'和新的Right <...>'。 – Lee

+0

感谢您回答李 - 通常Visual Studio是足够好找到这一点,但通过LanguageExt.Core包看,我找不到Left <>和Right <>(我期望找到与Either <>相同的命名空间) 。这让我觉得我误解了一些根本性的东西 - 因此是一个问题。 –

+1

我发现我错过了 - “使用静态LanguageExt.Prelude;”这解决了事情正确。奇怪的是,Visual Studio的行为与此不同(并且我无法通过对象浏览器找到任何东西)。谢谢你的帮助。 –

回答

3

我错过了 - “using static LanguageExt.Prelude;”不知道为什么,但Visual Studio对此有点不同,我无法在对象浏览器中找到任何对Left或Right的引用。

3

我是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 

这样可以让你构建一个Either像这样:Right(x)

其他构造的功能是:Some(x)NoneOptionList(x,y,z)LstSet(x,y,x)Set

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); 

原因是三元运算符是一个表达式,而您使用多个语句来获得结果。如果你正在学习函数式编程,你应该尽可能地使用表达式来处理。异常是你需要声明局部变量的地方,但大多数情况下你可以在C#中使用纯粹的表达式。如果你的表情变得太大,把它们分解成更小的函数。函数式编程的一个副作用是你的函数会越来越小,有时只有单线事务。

+3

非常感谢您花时间写出答案。对此,我真的非常感激。我一直在努力尝试学习函数式编程一段时间,而我的问题部分原因是尝试了解我在“C#中的函数式编程”中阅读的内容,并将其转换为图书馆期望的结果取得了。这也不利于我通常在晚上11点30分试图这样做......最终,这是我希望能够在工作中应用的事情,但看起来我还有很长的路要走。 –

+0

确实需要一点时间才能进入功能性思维模式。你会有一系列的东西落在地方的时刻。我也是一个改革过的OO程序员,对我来说这个过程一直很有启发。 – louthster

+0

接下来的议程是弄清楚智能构造函数和验证。我希望能够将这个功能与领域驱动的设计概念结合起来,形成一个概念验证。 –