Recursion F#两个递归函数定义行为的奇怪差异

Recursion F#两个递归函数定义行为的奇怪差异,recursion,f#,Recursion,F#,我试图定义一个幂函数来计算x^y let rec powFunA (x,y) = match (x,y) with | (_,0) -> 1 | (x,y) -> x * powFunA (x,y-1);; 及 let rec powFunB x y = match y with | 0 -> 1 | y -> x * powFunB x y-1;; 调用powFunA(2,5)可以正常工作,结果我得到了32个。但不知何故,我不明白为什么

我试图定义一个幂函数来计算x^y

let rec powFunA  (x,y) = 
  match (x,y) with
  | (_,0) -> 1
  | (x,y) -> x * powFunA (x,y-1);;

let rec powFunB  x y =
  match y with
  | 0 -> 1
  | y -> x * powFunB x y-1;;
调用
powFunA(2,5)
可以正常工作,结果我得到了32个。但不知何故,我不明白为什么第二个调用
powfunb25
会导致
StackOverflowException

我还发现了一个定义:

let rec power = function
    | (_,0) -> 1.0 (* 1 *)
    | (x,n) -> x * power(x,n-1) (* 2 *) 
你能解释一下第一行定义中没有参数和函数的用法吗


谢谢。

此堆栈溢出错误与F#的优先规则有关。请考虑这个表达式:

powFunB x y-1
此表达式有一些函数应用程序和减号运算符。在F#(与所有ML语言一样)中,函数应用程序具有最高的优先级。没有比这更具约束力的了

因此,编译器将上述表达式理解为:

(powFunB x y) - 1
也就是说,函数应用程序
powFunB x y
first,减去运算符second。现在,我希望,很容易理解为什么这会导致无限递归

要修复此问题,只需应用括号来覆盖优先规则:

powFunB x (y-1)

“无参数”定义使用F#语法定义多用例函数。它只是一个快捷方式,允许编写
=函数
,而不是
x=match x with
。因此,例如,以下两个函数是等效的:

let f a = match a with | Some x -> [x] | None -> []
let g = function | Some x -> [x] | None -> []

只是一些语法糖,仅此而已。因此,您找到的定义与您的第一个代码段完全相同。

此堆栈溢出错误与F#的优先规则有关。请考虑这个表达式:

powFunB x y-1
此表达式有一些函数应用程序和减号运算符。在F#(与所有ML语言一样)中,函数应用程序具有最高的优先级。没有比这更具约束力的了

因此,编译器将上述表达式理解为:

(powFunB x y) - 1
也就是说,函数应用程序
powFunB x y
first,减去运算符second。现在,我希望,很容易理解为什么这会导致无限递归

要修复此问题,只需应用括号来覆盖优先规则:

powFunB x (y-1)

“无参数”定义使用F#语法定义多用例函数。它只是一个快捷方式,允许编写
=函数
,而不是
x=match x with
。因此,例如,以下两个函数是等效的:

let f a = match a with | Some x -> [x] | None -> []
let g = function | Some x -> [x] | None -> []
只是一些语法糖,仅此而已。因此,您找到的定义与您的第一个代码片段完全相同。

WRT F#operator priority:WRT F#operator priority: