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
Function 介绍性F#(斐波那契和函数表达式)_Function_F#_Functional Programming_Expression_Fibonacci - Fatal编程技术网

Function 介绍性F#(斐波那契和函数表达式)

Function 介绍性F#(斐波那契和函数表达式),function,f#,functional-programming,expression,fibonacci,Function,F#,Functional Programming,Expression,Fibonacci,我开始了一门关于F#介绍的课程,我在两项作业上遇到了一些问题。第一个让我创建了两个函数,其中第一个函数接受一个输入并加上四个,第二个函数计算sqrt(x^2+y^2)。然后我应该为这两个函数都编写函数表达式,但由于某种原因,它给了我错误“实现文件中的意外符号“|” 第二个任务要求我创建一个函数,用于查找Fibonaccis数的序列。我已经编写了以下代码,但它似乎在一开始就忘记了0,因为输出总是n+1而不是n let rec fib = function |0 -> 0 |1 -> 1

我开始了一门关于F#介绍的课程,我在两项作业上遇到了一些问题。第一个让我创建了两个函数,其中第一个函数接受一个输入并加上四个,第二个函数计算sqrt(x^2+y^2)。然后我应该为这两个函数都编写函数表达式,但由于某种原因,它给了我错误“实现文件中的意外符号“|”

第二个任务要求我创建一个函数,用于查找Fibonaccis数的序列。我已经编写了以下代码,但它似乎在一开始就忘记了0,因为输出总是n+1而不是n

let rec fib = function
|0 -> 0
|1 -> 1
|n -> fib(n-1) + fib(n-2)
;;

请记住,这是第一周,因此我应该能够使用这些方法创建这些代码。

您的第一个代码片段主要有两个问题:

  • 在F#中,
    float
    int
    之间存在差异。将整数值写入
    4
    0
    ,将浮点值写入
    4.0
    0.0
    。F#不会自动将整数转换为浮点数,因此需要保持一致

  • 您在
    f
    函数中的语法有点奇怪-我不确定
    float
    应该是什么意思,
    fun
    函数
    结构的行为不同

因此,从原始代码开始:

let g = fun n -> n + 4;;
这是可行的,但我不会使用
fun
将其编写为显式函数-您也可以使用
let
来定义函数,而且更简单。此外,您只需要
在F#Interactive中,但是如果您使用任何一个体面的编辑器和命令(通过Alt+Enter)将代码发送到F#Interactive,您不需要它

但是,在
f
函数中,您希望返回
float
,因此需要修改
g
以返回float。这意味着将
4
替换为
4.0

let g n = n + 4.0
h
函数很好,但是您可以使用
let
再次编写它:

let h (x,y) = System.Math.Sqrt((x*x)+(y*y));;
f
函数中,您可以使用
function
使用模式匹配编写函数,也可以使用
match
使用更详细的语法(
function
只是编写函数然后在输入上进行模式匹配的简写):


还要注意,缩进很重要-在
|

之前需要空格。您的第一个代码段主要有两个问题:

  • 在F#中,
    float
    int
    之间存在差异。将整数值写入
    4
    0
    ,将浮点值写入
    4.0
    0.0
    。F#不会自动将整数转换为浮点数,因此需要保持一致

  • 您在
    f
    函数中的语法有点奇怪-我不确定
    float
    应该是什么意思,
    fun
    函数
    结构的行为不同

因此,从原始代码开始:

let g = fun n -> n + 4;;
这是可行的,但我不会使用
fun
将其编写为显式函数-您也可以使用
let
来定义函数,而且更简单。此外,您只需要
在F#Interactive中,但是如果您使用任何一个体面的编辑器和命令(通过Alt+Enter)将代码发送到F#Interactive,您不需要它

但是,在
f
函数中,您希望返回
float
,因此需要修改
g
以返回float。这意味着将
4
替换为
4.0

let g n = n + 4.0
h
函数很好,但是您可以使用
let
再次编写它:

let h (x,y) = System.Math.Sqrt((x*x)+(y*y));;
f
函数中,您可以使用
function
使用模式匹配编写函数,也可以使用
match
使用更详细的语法(
function
只是编写函数然后在输入上进行模式匹配的简写):


还要注意缩进很重要-在
|

之前需要空格,我将处理第一个代码块,并将斐波那契函数留待以后使用。首先我会转载你的代码,然后我会谈论它

let g = fun n -> n + 4;;

let h = fun (x,y) -> System.Math.Sqrt((x*x)+(y*y));;

let f = fun (x,n) -> float
|(n,0) -> g(n)
|(x,n) -> h(x,n);;
第一条注释:如果您正在定义一个函数并立即将其分配给一个名称,就像在所有这些示例中一样,您不需要
fun
关键字。定义函数的常用方法是将它们写成
let(name)(parameters)=(function body)
。因此,上面的代码将变成:

let g n = n + 4;;

let h (x,y) = System.Math.Sqrt((x*x)+(y*y));;

let f (x,n) = float
|(n,0) -> g(n)
|(x,n) -> h(x,n);;
我没有做任何其他更改,因此您的
f
函数中仍然有一个错误。下面我们来解决这个错误

我认为你在这里犯的错误是认为
fun
function
是可以互换的。他们不是
fun
是标准函数定义,但
function
是另一种定义。在F#中,编写如下函数是一种非常常见的模式:

let someFunc parameter =
    match parameter with
    | "case 1" -> printfn "Do something"
    | "case 2" -> printfn "Do something else"
    | _ -> printfn "Default behavior"
函数
关键字是一个参数加上匹配表达式的缩写。换言之,这:

let someFunc = function
    | "case 1" -> printfn "Do something"
    | "case 2" -> printfn "Do something else"
    | _ -> printfn "Default behavior"
与此代码完全相同:

let someFunc parameter =
    match parameter with
    | "case 1" -> printfn "Do something"
    | "case 2" -> printfn "Do something else"
    | _ -> printfn "Default behavior"
只有一个区别。在带有
函数
关键字的版本中,您不能选择参数的名称。它由F#编译器自动创建,由于您无法预先知道参数的名称,因此无法在代码中引用它。(好吧,有很多方法,但我不想让你在学会走路之前先学会跑步,可以这么说)。还有一件事:当你还在学习F#时,我强烈建议你不要使用
函数
关键字。一旦你知道你在做什么,它真的很有用,但是在你的早期学习阶段,你应该使用更明确的
匹配(参数)和
表达式。这样你就会习惯于看到它在做什么。一旦你做了几个月的F#,那么你就可以开始replac了