Tag: functional programming

使用linq将列表或订购日期拆分为几周

假设我在2018年有5个日期[Mar 2,Mar 6, Mar 7, Mar 26]的列表。周六开始,周六结束。 我想要以下结果 [Mar 2] [Mar 6, Mar 7] [Mar 26] 我怎么能用LINQ做到这一点? 或者以function的方式。

c#中的Universal Func 类型

我正在用C#编写一个小的Lisp解释器,它基本上已经工作了。 目前我正在使用一个接口来表示函数: public interface LispFunction { object Apply(ArrayList parameters); } 接口由内部(标准)函数,lambdas,宏扩展,通过reflection调用.net对象中的方法等多个类实现。 请注意,速度在这里不是问题,只是让翻译工作的乐趣,并在工作中使用它。 现在我想让我的小Lisp接受在解释器中使用的任意C#lambdas,如下所示: Lisp foo = new Lisp(); foo.GlobalEnvironment.AddFunction(“test”, (bool a, int b) => a ? b : “whoops”); foo.Eval(foo.Read(“(test #t 5)”)); // Should evaluate to (object) 5 我想到的第一件事就是使用Func ,但我必须使用大量的重载方法来实现Func , Func , Func等等上。 C#中是否有可能接受随后通过reflection调用的任意lambdas?

替代Y组合子定义

我最近花了一些时间围绕Y组合器,我发现它通常定义(或多或少)如下(这是在C#中,但选择的语言并不重要): public delegate TResult SelfApplicable(SelfApplicable r); public static TResult U(SelfApplicable r) { return r(r); } public static Func Y(Func<Func, Func> f) { return U<Func>(r => arg1 => f(U(r))(arg1)); } 虽然这是完美的function(双关语),但似乎我的定义更简单: public static Func Y(Func<Func, Func> f) { return f(n => Y(f)(n)); } 有没有理由说后一个定义不常见(我还没有在网上找到它)? 它可能与定义Y本身有关吗?

函数式语言编译器优于命令式语言编译器的优点

作为这个问题的后续内容F#内置不变性对C#有什么好处? –am我正确地假设F#编译器可以在知道它处理很大程度上不可变的代码时进行某些优化吗? 我的意思是,即使开发人员编写“Functional C#”,编译器也不会知道开发人员试图编写的所有不可变性,因此它无法进行相同的优化,对吧? 通常情况下,函数式语言的编译器能够进行使用命令式语言无法实现的优化 – 即使是尽可能多的不可写性编写的语言?

在C#中使用Y Combinator

我试图弄清楚如何在一行中编写递归函数(例如阶乘,尽管我的函数要复杂得多)。 为此,我想到了使用Lambda Calculus的 Y组合器 。 这是第一个定义: Y = λf.(λx.f(xx))(λx.f(xx)) 这是减少的定义: Y g = g(Y g) 我尝试用C#编写它们: // Original Lambda Y = f => (new Lambda(x => f(x(x)))(new Lambda(x => f(x(x))))); // Reduced Lambda Y = null; Y = g => g(Y(g)); ( Lambda是一个Func 。我首先尝试使用usedef它,但这不起作用 ,所以现在用delegate dynamic Lambda(dynamic arg); ) 我的阶乘lambda看起来像这样(改编自这里 ): Lambda factorial = f […]

推断具有function组合的generics类型

假设我想实现一个function组合,如下所示: public Func Compose(Func f, Func g) { return new Func( x => f(g(x))); } 现在在实践中,我可以像这样使用这个Compose()fn: public String ToUpper(String s) { return s.ToUpper(); } public String Replicate(String s) { return s+s; } public void Run() { var h = Compose(ToUpper, Replicate); System.Console.WriteLine(“{0}”, h(“fred”)); } 结果是FREDFRED 。 有没有办法使用更简单的语法来调用Compose? 我试过这样的: var h = Compose(ToUpper, Replicate); …但我收到编译错误: 错误CS0411:无法从用法推断出方法’FunctionalTest.Compose(System.Func,System.Func)’的类型参数。 […]

委托中变量的范围

我发现以下内容相当奇怪。 然后,我主要使用动态语言中的闭包,这对于同一个“bug”不应该是可疑的。 以下使编译器不满意: VoidFunction t = delegate { int i = 0; }; int i = 1; 它说: 名为“i”的局部变量不能在此范围内声明,因为它会为“i”赋予不同的含义,“i”已在“子”范围中用于表示其他内容 所以这基本上意味着在委托中声明的变量将具有声明的函数的范围。不完全是我所期望的。 我甚至没有试过调用这个函数。 至少Common Lisp有一个function,你可以说变量应该有一个动态名称,如果你真的希望它是本地的。 这在创建不泄漏的宏时尤其重要,但这样的东西也会有所帮助。 所以我想知道其他人如何解决这个问题呢? 为了澄清我正在寻找一个解决方案,其中我在delegete中声明的变量不会干扰委托后声明的变量。 我仍然希望能够捕获委托之前声明的变量。

在C#中以函数方式遍历树

在c#,Traverse中考虑以下扩展方法: IEnumerable Traverse( this IEnumerable source, Func<T, IEnumerable> fnRecurse ); 此方法允许通过T定义的树递归,并且任何函数都会导致T返回其子节点。 现在考虑以下T的实现: class Node { public string Name; public List Children; } 我的目标是编写可能的最短函数,它将返回包含此树中每个节点的完全限定路径的IEnumerable。 就像是: var node = GetParentNode(); return node.Traverse( node => node.Children ) .Select( node => GetParentName(node) + “:” + node.Name ); 显然,向Node添加Parent属性会使问题变得微不足道。 相反,我想以某种方式在仿函数中构建我的父字符串。 我不认为这在C ++中会太难,但我不知道如何在C#中做到这一点。 有任何想法吗?

C#foreach vs functional各

您更喜欢哪一种? foreach(var zombie in zombies) { zombie.ShuffleTowardsSurvivors(); zombie.EatNearbyBrains(); } 要么 zombies.Each(zombie => { zombie.ShuffleTowardsSurvivors(); zombie.EatNearbyBrains(); });

C#中的通用Map / Reduce List Extensions

我正在编写一些扩展来模仿地图并减少Lisp中的函数。 public delegate R ReduceFunction(T t, R previous); public delegate void TransformFunction(T t, params object[] args); public static R Reduce(this List list, ReduceFunction r, R initial) { var aggregate = initial; foreach(var t in list) aggregate = r(t,aggregate); return aggregate; } public static void Transform(this List list, TransformFunction f, params object [] args) { foreach(var […]