Oop 混合函数/面向对象语言,如F#/Scala:将类型与方法或方法与类型一起使用

Oop 混合函数/面向对象语言,如F#/Scala:将类型与方法或方法与类型一起使用,oop,scala,f#,functional-programming,Oop,Scala,F#,Functional Programming,为了补充我从这个问题中学到的东西,我问: 这让我开始思考是否应该将类型与方法或记录(?)和方法一起使用。例如,这是我可能制作的典型类型: (*用户交互开始*) 键入UserInteraction public() 成员public x.CreatePassword(originalPassword)= 如果String.IsNullOrEmpty originalPassword,则 引发(新ArgumentException“CreatePassword:密码为null或空”) 让hashU

为了补充我从这个问题中学到的东西,我问:

这让我开始思考是否应该将类型与方法或记录(?)和方法一起使用。例如,这是我可能制作的典型类型:

(*用户交互开始*)
键入UserInteraction public()
成员public x.CreatePassword(originalPassword)=
如果String.IsNullOrEmpty originalPassword,则
引发(新ArgumentException“CreatePassword:密码为null或空”)
让hashUtility=newhashutility();
hashUtility.CreateHash originalPassword
我看到的问题是,由于允许,用户交互类型中的某些内容可能是可变的。就我所知,现在对于记录类型,它们保证是不可变的

使用只接收或返回记录类型的方法设计一个模块会更好吗,或者甚至可以使用方法链接更进一步?

您可能需要阅读(页面底部)。您似乎对记录有一些不正确的假设。例如,它们可以像类一样具有可变字段。重要的区别是继承、模式匹配、构造函数、隐藏成员、相等以及复制和更新表达式

刚刚注意到该页面上的一个小错误:事实上,记录可以实现接口


另一个可能有用的部分:(页面底部)

请注意,您可以在不可变类型上创建一个成员,返回该类型的新修改实例,这是非常合理的:

输入人物=
{Name:string;Age:int}
成员x.n=
{x,年龄=x.年龄+n}
设q={Name=“David”;Age=29};;
q、 成长1
有趣的是,在下面的C代码中:

var x=0;
变量y=1;
var z=x+y;

您不会期望使用运算符+,即+返回一个新值,并且不会对x或y进行变异。一般来说,你可以考虑在脑海中设计所有的东西。我对函数式编程相当陌生,所以我试图弄清楚,尽管我反对函数式编程,但我是否因为F#允许而强制使用命令式规则。这是一个Scala问题吗?Scala没有与F#记录完全相似的东西,您可以通过声明
val
var
轻松控制某个东西是可变的还是不可变的。(另外,如果你足够努力的话,你总是可以把可变状态隐藏在某个地方。)@programmingtool:对我来说,这听起来像是一个广泛的目标。如果您可以为代码片段添加更多上下文,人们可能会提出具体建议。我真的建议您阅读Tomas Petrick的现实世界函数式编程示例: