2017-04-26 45 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

接下來的議程是弄清楚智能構造函數和驗證。我希望能夠將這個功能與領域驅動的設計概念結合起來,形成一個概念驗證。 –