Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 作用域分配_F# - Fatal编程技术网

F# 作用域分配

F# 作用域分配,f#,F#,我仍在试图获得函数式编程的思维模式,因此我不确定这个问题是否有意义:在F#中是否可能,就像在R中一样 假设我正在为F#中的abs(int:y)设计一个函数split x当x=y+10z时,值(变量)是不可变的,不能更新z的值 let z = abs(x / 10) 及 是具有不同作用域的不同声明值 F#中的范围由缩进标识,因此当您返回 (y, z);; 返回带有相同缩进的z(let z=abs(x/10))关键字创建名称绑定,表示“此名称表示此值”(或此函数)。它是不可变的:在您编写的代码中

我仍在试图获得函数式编程的思维模式,因此我不确定这个问题是否有意义:在F#中是否可能,就像在R中一样

假设我正在为F#中的
abs(int:y)设计一个函数
split x
x=y+10z
时,值(变量)是不可变的,不能更新z的值

let z = abs(x / 10)

是具有不同作用域的不同声明值

F#中的范围由缩进标识,因此当您返回

(y, z);;

返回带有相同缩进的z(
let z=abs(x/10)

关键字创建名称绑定,表示“此名称表示此值”(或此函数)。它是不可变的:在您编写的代码中,
split
函数中的名称
z
将始终引用值
abs(x/10)
,并且不能更改。如果modz>5=…
块中的
让z=z+1
表达式未重新指定外部
z
的值。相反,它创建了一个新的定义
z
,它位于块的本地。你写的代码是这样说的:“在这个
if
表达式的真实部分,我想要一个名为
z
的名字,它的值是我目前知道的
z
的值,加上1。哦,对我隐藏“外部”
z
:在这个块中,我想使用我对
z
的定义。”但在块外部,“外部”
z
不变。这允许您随意重新定义名称,而不会意外地在其他代码中引起错误,这通常是一件好事

您要做的是创建一个可变变量,这是通过将
mutable
关键字添加到
let
来完成的。为可变变量分配新值的语法也不同:它根本不使用
let
。你想写的是:

let mutable z = abs(x / 10)
// Later on...
z <- z + 1

这将更具功能性,并且避免使用
mutable

我印象深刻。你刚刚让我明白了比预期多得多的事情。非常感谢。请注意,我刚刚编辑了我的示例,因为最后一行是错误的。我最初写的是
(y+increment,z)
,但我应该写的是
(y,z+increment)
,以匹配函数的逻辑。此外,我还省略了
.fs
文件,就不需要它们。但是,如果要在F#交互式解释器中输入代码,您确实需要它们,所以请包含
在代码末尾。是的,我注意到了,但我还是明白了要点。无论如何,谢谢你的更正。谢谢你的建议,这对我来说是一个非常有用的信息!
let z = z + 1
(y, z);;
let mutable z = abs(x / 10)
// Later on...
z <- z + 1
let split x =
    let z = abs(x / 10)
    let modz = abs(x % 10)
    let increment = if modz > 5 then 1 else 0
    let y = if modz > 5 then abs(5 - modz) else modz
    (y, z + increment)