簡體   English   中英

我希望在C#中看到的一些F#功能

[英]Some F# Features that I would like to see in C#

在搞亂了F#之后,有一些非常好的功能,我認為當我必須回到C#時,我會想念我,如何能夠讓自己脫離以下內容,或者更好地復制它們的功能:

  • 模式匹配(尤其是與歧視聯盟)
  • 歧視工會
  • 遞歸函數(列表中的頭部和尾部)

最后但並非最不重要的是Erlang啟發的Message Processing。

使用F#創建可以從C#調用的可重用庫

關於F#的一個非常好的事情是它仍然是.NET語言。 您可以根據需要在CLR中混合和匹配語言...

我不確定這在多大程度上是一個問題。 但是,這里有一些典型的模式,我用它來編碼C#中的這些功能結構(其中一些來自我的書,它有源代碼可用 )。

受歧視的聯合 - 實際上沒有好的方法在C#中實現有區別的聯合 - 你唯一能做的就是將它們實現為一個類層次結構(一個基類代表DU類型,每個DU案例都有一個派生類) 。 您還可以將Tag屬性(某些enum類型)添加到基類,以便更輕松地檢查該類所代表的大小寫。 據我所知,這用於LINQ表達式樹(實際上應該是區分聯合)。

模式匹配 - 你可能永遠不會以完全通用的方式獲得它(例如使用嵌套模式),但是你可以模擬像這樣的區分聯合的模式匹配(使用Option<int>類型,它是Some of intNone ) :

Option<int> value = GetOption();
int val;
if (value.TryMatchSome(out val)) 
  Console.WriteLine("Some {0}", val);
else if (value.TryMatchNone()) 
  Console.WriteLine("None");

不完美,但至少你得到一個相對不錯的方法從案例中提取價值。

消息傳遞 - 有並發和協調運行時 ,它在某些方面也基於消息傳遞,可以在C#中使用。 我敢打賭你也可以使用基於迭代器的技術從C#使用F#郵箱處理器,我在本文對此進行了描述,並且也用於Wintellect PowerThreading庫。 但是,我認為沒有人基於這個想法實現了一個可靠的消息傳遞庫。

總之,您可以在C#中模擬許多功能特性,至少在某種程度上可以使用其他一些而沒有任何問題(lambda函數和高階函數)。 但是,如果您需要F#的全部功能,那么您只需要說服您的公司開始使用F#:-)。

可以在C#中模擬判別的聯合和模式匹配,盡管類型定義有點冗長(有關一些想法,請參閱如何在C#中復制F#區分聯合類型? )。 這是我在該問題中提出的方法:F# type T = ACase of A | BCase of B | CCase of C type T = ACase of A | BCase of B | CCase of C type T = ACase of A | BCase of B | CCase of C可以用C#抽象類表示,帶有一些靜態輔助方法。

public abstract class T {
    public abstract X Match<X>(Func<A,X> aCase, Func<B,X> bCase, Func<C,X> cCase);

    private class ACase : T {
        private A a;
        public ACase(A a) { this.a = a; }

        public override X Match<X>(Func<A,X> aCase, Func<B,X> bCase, Func<C,X> cCase) {
            return aCase(a);
        }
    }
    private class BCase : T {
        private B b;
        public BCase(B b) { this.b = b; }

        public override X Match<X>(Func<A,X> aCase, Func<B,X> bCase, Func<C,X> cCase) {
            return bCase(b);
        }
    }
    private class CCase : T {
        private C c;
        public CCase(C c) { this.c = c; }

        public override X Match<X>(Func<A,X> aCase, Func<B,X> bCase, Func<C,X> cCase) {
            return cCase(c);
        }
    }

    public static T MakeACase(A a) { return new ACase(a); }
    public static T MakeBCase(B b) { return new BCase(b); }
    public static T MakeCCase(C c) { return new CCase(c); }
}

匹配現在看起來類似於F#,但沒有案例標簽。 相當於這個F#代碼:

function
| A a -> 1
| B b -> 2
| C c -> 3

這是C#代碼:

public static int MatchDemo(T t) {
    return t.Match(
        a => 1,
        b => 2,
        c => 3);
}

查看

開關/模式匹配的想法

一些瘋狂的方法嘗試在C#中進行模式匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM