Function 介绍性F#(斐波那契和函数表达式)
我开始了一门关于F#介绍的课程,我在两项作业上遇到了一些问题。第一个让我创建了两个函数,其中第一个函数接受一个输入并加上四个,第二个函数计算sqrt(x^2+y^2)。然后我应该为这两个函数都编写函数表达式,但由于某种原因,它给了我错误“实现文件中的意外符号“|” 第二个任务要求我创建一个函数,用于查找Fibonaccis数的序列。我已经编写了以下代码,但它似乎在一开始就忘记了0,因为输出总是n+1而不是nFunction 介绍性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
let rec fib = function
|0 -> 0
|1 -> 1
|n -> fib(n-1) + fib(n-2)
;;
请记住,这是第一周,因此我应该能够使用这些方法创建这些代码。您的第一个代码片段主要有两个问题:
- 在F#中,
和float
之间存在差异。将整数值写入int
或4
,将浮点值写入0
或4.0
。F#不会自动将整数转换为浮点数,因此需要保持一致0.0
- 您在
函数中的语法有点奇怪-我不确定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
。F#不会自动将整数转换为浮点数,因此需要保持一致0.0
- 您在
函数中的语法有点奇怪-我不确定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了