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
Syntax F#中的递归加法_Syntax_F# - Fatal编程技术网

Syntax F#中的递归加法

Syntax F#中的递归加法,syntax,f#,Syntax,F#,我试图在F中实现以下加法递归定义# m+0:=m m+(n+1):=(m+n)+1 我似乎无法理解正确的语法,最接近的是 let rec plus x y = match y with | 0 -> x; | succ(y) -> succ( plus(x y) ); 其中成功n=n+1。它在模式匹配中抛出了一个错误。我不确定succ在您的

我试图在F中实现以下加法递归定义#

m+0:=m

m+(n+1):=(m+n)+1

我似乎无法理解正确的语法,最接近的是

let rec plus x y =                        
 match y with                     
 | 0 -> x;                        
 | succ(y) -> succ( plus(x y) );

其中成功n=n+1。它在模式匹配中抛出了一个错误。

我不确定
succ
在您的示例中是什么意思,但它不是标准F#库中定义的模式。仅使用基本功能,您需要使用匹配任意数字的模式,然后减去一(并在正文中添加一):

在F#(与Prolog不同),您不能在模式中使用自己的函数。但是,您可以定义活动模式,指定如何将输入分解为各种情况。下面是一个整数,并返回值
y+1
Zero
(对于零)或
succy

let (|Zero|Succ|) n = 
  if n < 0 then failwith "Unexpected!"
  if n = 0 then Zero else Succ(n - 1)

我不确定
succ
在您的示例中是什么意思,但它不是标准F#库中定义的模式。仅使用基本功能,您需要使用匹配任意数字的模式,然后减去一(并在正文中添加一):

在F#(与Prolog不同),您不能在模式中使用自己的函数。但是,您可以定义活动模式,指定如何将输入分解为各种情况。下面是一个整数,并返回值
y+1
Zero
(对于零)或
succy

let (|Zero|Succ|) n = 
  if n < 0 then failwith "Unexpected!"
  if n = 0 then Zero else Succ(n - 1)

正如Tomas所说,如果不声明它,就不能像这样使用
suc
。您可以做的是创建一个表示数字的有差别的联合:

type Number = 
| Zero
| Succ of Number
然后在
plus
功能中使用:

let rec plus x y =
 match y with
 | Zero -> x
 | Succ(y1) -> Succ (plus x y1)
或者您可以将其声明为
+
运算符:

let rec (+) x y =
 match y with
 | Zero -> x
 | Succ(y1) -> Succ (x + y1)

如果将
y
保留在我的
y1
位置,则代码将起作用,因为第二个
y
将隐藏第一个。但是我认为这样做会让代码变得混乱。

正如Tomas所说,如果不声明它,就不能像这样使用
succ
。您可以做的是创建一个表示数字的有差别的联合:

type Number = 
| Zero
| Succ of Number
type N = Zero | Succ of N

let rec NtoInt n =
  match n with
  | Zero -> 0
  | Succ x -> 1 + NtoInt x

let rec plus x y =
  match x with
  | Zero -> y
  | Succ n -> Succ (plus n y)
然后在
plus
功能中使用:

let rec plus x y =
 match y with
 | Zero -> x
 | Succ(y1) -> Succ (plus x y1)
或者您可以将其声明为
+
运算符:

let rec (+) x y =
 match y with
 | Zero -> x
 | Succ(y1) -> Succ (x + y1)
如果将
y
保留在我的
y1
位置,则代码将起作用,因为第二个
y
将隐藏第一个。但我认为这样做会让代码变得混乱

type N = Zero | Succ of N

let rec NtoInt n =
  match n with
  | Zero -> 0
  | Succ x -> 1 + NtoInt x

let rec plus x y =
  match x with
  | Zero -> y
  | Succ n -> Succ (plus n y)
演示:

> plus (Succ (Succ Zero)) Zero |> NtoInt ;;
val it : int = 2
> plus (Succ (Succ Zero)) (Succ Zero) |> NtoInt ;;
val it : int = 3
演示:

> plus (Succ (Succ Zero)) Zero |> NtoInt ;;
val it : int = 2
> plus (Succ (Succ Zero)) (Succ Zero) |> NtoInt ;;
val it : int = 3

succ(y)是函数调用,不能在模式匹配中使用。succ(y)是函数调用,不能在模式匹配中使用。这里的要点是声明加法操作,而不是使用现有操作。请参阅。这里的要点是声明加法操作,而不是使用现有操作。看。我猜加号参数是整数,它不适用于这种数字类型如果它们是整数,就不需要用这种方式实现加法,不是吗?是的,但这只是一个尝试递归函数的示例。我猜加号参数是整数,它不适用于这种数字类型如果它们是整数,不需要以这种方式实现加法,不是吗?是的,但这只是一个尝试递归函数的示例。