Syntax F#中的递归加法
我试图在F中实现以下加法递归定义# m+0:=m m+(n+1):=(m+n)+1 我似乎无法理解正确的语法,最接近的是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在您的
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)是函数调用,不能在模式匹配中使用。这里的要点是声明加法操作,而不是使用现有操作。请参阅。这里的要点是声明加法操作,而不是使用现有操作。看。我猜加号参数是整数,它不适用于这种数字类型如果它们是整数,就不需要用这种方式实现加法,不是吗?是的,但这只是一个尝试递归函数的示例。我猜加号参数是整数,它不适用于这种数字类型如果它们是整数,不需要以这种方式实现加法,不是吗?是的,但这只是一个尝试递归函数的示例。