繁体   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