我最近一直在学习函数式编程(特别是Haskell,但我也经历了关于Lisp和Erlang的教程)。 虽然我发现这些概念非常有启发性,但我仍然没有看到“无副作用”概念的实际方面。 它的实际优势是什么? 我试图用function思维来思考,但是有些情况看起来过于复杂,没有一种简单的方式来保存状态(我不认为Haskell的monads很容易)。 是否值得继续深入学习Haskell(或另一种纯粹的函数式语言)? function性或无状态编程实际上比程序更有效率吗? 以后可能会继续使用Haskell或其他函数式语言,还是应该只为了解而学习? 我关心的不是性能而是生产力。 所以我主要是问我在function语言上是否会比程序/面向对象/什么更有效率。
我有这个API函数: public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d, string e, string f, out Guid code) 我不喜欢它。 因为参数顺序变得不必要的重要。 添加新字段变得更加困难。 很难看到传递的是什么。 将方法重构成更小的部分比较困难,因为它会在子函数中传递所有参数。 代码很难阅读。 我想出了一个最明显的想法:有一个对象封装数据并传递,而不是逐个传递每个参数。 这是我想出来的: public class DoSomeActionParameters { public string A; public string B; public DateTime C; public OtherEnum D; public string E; public string F; } 这减less了我的API声明: public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out […]
不好意思的是,如果我能拿出一个简洁的标题,我不会问这个问题。 假设我有一个不可变的列表types。 它有一个操作Foo(x) ,它返回一个带有指定参数的新的不可变列表作为最后一个额外的元素。 所以要build立一个值为“你好”,“不可变”,“世界”的string列表,你可以这样写: var empty = new ImmutableList<string>(); var list1 = empty.Foo("Hello"); var list2 = list1.Foo("immutable"); var list3 = list2.Foo("word"); (这是C#代码,如果你觉得这个语言很重要,我最感兴趣的是C#的build议,这不是一个基本的语言问题,但是这个语言的习惯用法可能很重要。 重要的是现有的列表不会被Foo修改,所以empty.Count仍然会返回0。 另一种(更习惯的)达到最终结果的方式是: var list = new ImmutableList<string>().Foo("Hello") .Foo("immutable") .Foo("word"); 我的问题是: Foo最好的名字是什么? 编辑3 :正如我后来透露,types的名称可能实际上不是ImmutableList<T> ,这使得位置清晰。 想象一下,它是TestSuite ,它是不可变的,因为它是整个框架的一部分是不可变的… (编辑结束3) 我到目前为止的选项: Add :在.NET中通用,但意味着原始列表的变化 Cons :我认为这是function语言中的普通名字,但对那些没有这种语言经验的人来说毫无意义 Plus :迄今为止我的最爱,这并不意味着我的变化 。 显然这也是在Haskell中使用的,但是期望稍有不同(Haskell程序员可能期望它将两个列表一起添加,而不是向另一个列表添加单个值)。 With :一致的一些其他不变的约定,但不具有相同的“增加”它IMO。 And :不是很具描述性。 运营商超负荷+:我真的不喜欢这么多; 我一般认为运营商只适用于较低层次的types。 […]
我最近在javascript中遇到了const关键字。 从我可以告诉,它被用来创build不可变的variables ,我已经testing,以确保它不能被重新定义(在node.js中): const x = 'const'; const x = 'not-const'; // Will give an error: 'constant 'x' has already been defined' 我意识到它在所有的浏览器中都还没有被标准化 – 但是我只对node.js / v8的上下文感兴趣,而且我注意到当var关键字可以被使用时,某些开发者/达到相同的效果。 问题 ? 什么时候可以使用const代替var ? 是否应该每次使用一个不会被重新分配的variables被声明? 如果使用var代替const ,反之亦然?
我试图从Python中删除string中的特定字符。 这是我现在使用的代码。 不幸的是,它似乎没有做任何事情的string。 for char in line: if char in " ?.!/;:": line.replace(char,'') 我如何正确地做到这一点?
我已经知道不可变类的定义,但是我需要一些例子。
如果一个string是不可变的,那么这是否意味着….(让我们假设JavaScript) var str = 'foo'; alert(str.substr(1)); // oo alert(str); // foo 这是否意味着,当调用一个string的方法时,它会返回修改的string,但它不会改变初始string? 如果string是可变的,这是否意味着第二个alert()将返回oo ?
我的目标是使一个Java对象不可变。 我有一个classStudent 。 我用下面的方式编码来实现不变性: public final class Student { private String name; private String age; public Student(String name, String age) { this.name = name; this.age = age; } public String getName() { return name; } public String getAge() { return age; } } 我的问题是,什么是最好的方式来实现Student课的不变性?
我正在创build一个不可变的类。 我已将所有属性标记为只读。 我有一个class级的项目清单。 虽然如果属性是只读的,那么列表可以被修改。 公开列表的IEnumerable使其不可变。 我想知道为了使一个类不可变而必须遵循的基本规则是什么?
与同事就此事进行友好的讨论。 我们对此有一些想法,但是想知道SO群体对此有何看法?