Tag: functional programming

通过检查元素的条件将列表拆分为子列表

假设我有一个integeres数组,我想把它分成几个部分,我想用零作为何时破坏的条件。 像这样的东西: [1,2,3,0,4,5,0,6,7] => [[1,2,3,0], [4,5,0], [6,7]] 好吧,可以使用两个for循环轻松完成,但我想知道是否可以使用LINQ执行此操作。 有这样的问题[1] , [2] ,但与此相反,它们依赖于从列表外部提供的条件。 注意:我知道在一个post中提出多个问题是不礼貌的,但是如果有人熟悉函数式编程(因为在本质上,它确实是一个FP问题),我也希望看到他们的观点和这个问题的可能解决方案。

是否有惯用的C#等同于C的逗号运算符?

我正在使用C#中的一些function,并继续坚持List.Add不返回更新列表的事实。 一般来说,我想在一个对象上调用一个函数,然后返回更新的对象。 例如,如果C#有一个逗号运算符会很棒: ((accum, data) => accum.Add(data), accum) 我可以像这样编写自己的“逗号运算符”: static T comma(Action a, Func result) { a(); return result(); } 看起来它会起作用,但是呼叫站点会很难看。 我的第一个例子是: ((accum, data) => comma(accum.Add(data), ()=>accum)) 足够的例子! 如果没有其他开发人员出现并且在代码味道上皱起鼻子,最干净的方法是什么?

在C#中访问F#区分联合类型数据的最简单方法是什么?

我试图了解C#和F#可以一起玩的程度。 我从F#for Fun&Profit博客中获取了一些代码,该博客执行基本validation,返回一个有区别的联合类型: type Result = | Success of ‘TSuccess | Failure of ‘TFailure type Request = {name:string; email:string} let TestValidate input = if input.name = “” then Failure “Name must not be blank” else Success input 试图在C#中使用它时; 我可以找到访问成功和失败的值的唯一方法(失败是一个字符串,成功是请求再次)是大讨厌的演员表(这是很多打字,并需要输入我希望的实际类型推断或在元数据中可用): var req = new DannyTest.Request(“Danny”, “fsfs”); var res = FSharpLib.DannyTest.TestValidate(req); if (res.IsSuccess) { Console.WriteLine(“Success”); var result […]

LINQ有多少钱?

我正在研究LINQ,并且查询语言出现(至少在表面上)只不过是Haskell和其他FP语言中的地图和/或列表推导的实现(特别是’map’和’的概括)为’在斯卡拉)。 它是否正确? 语法是否比这更多? 从我正在阅读的这本书(“Essential LINQ”)的令人窒息的语气来看,这里似乎有一些新的或创新的东西。 有整个后端,管道,一阶表达式树和类型等来实现LINQ,但我的问题是关于查询语言本身。 干杯 乔

什么是catamorphism,可以在C#3.0中实现吗?

我正在尝试了解catamorphisms,我已经阅读了维基百科文章以及F#博客上F#主题系列中的前几篇文章 。 我理解这是折叠的概括(即,将许多值的结构映射到一个值,包括值列表到另一个列表)。 我认为折叠列表和折叠树是一个典型的例子。 可以使用LINQ的Aggregate运算符或其他一些更高阶的方法在C#中显示它吗?

C#中的管道转发

继续我在C#中表达F#想法的调查 ,我想要一个管道前进算子。 对于包含在IEnumerable中的任何东西,我们已经拥有它,因为你可以.NextFunc()到你心中的内容。 但是,例如,如果最后有任何类似折叠的缩减,则无法将其结果输入函数。 这里有两个扩展方法,我想知道是否有其他人尝试过这个,如果这是一个好主意(编辑:现在使用Earwicker的可能包含): public static void Pipe(this T val, Action action) where T : class { if (val!=null) action(val); } public static R Pipe(this T val, Func func) where T : class where R : class { return val!=null?func(val):null; } 然后你可以写下这样的东西: Func readlines = (f) => File.ReadAllLines(f); Action writefile = (f, s) => […]