在F#中递归,期望类型为int,但得到类型“int list”
我是F#的新手,希望通过递归地实现列表的最小公倍数函数,例如lcm(a,b,c)= lcm(a,lcm(b,c)),其中lcm是两个元素从gcd计算。
我有以下代码。 我尝试将lcm函数的输入与两个元素的列表进行匹配,否则就是一个通用列表,我将其分解为第一个元素和其余部分。 “lcm(tail)”部分给出编译器错误。 它表示预计会有类型“int”,但类型为“int list - > int”。 它看起来像表示“lcm尾巴”本身就是一个函数,我不明白。 为什么它不是一个整数?
let rec gcd a b =
if b = 0
then abs a
else gcd b (a % b)
let lcmSimple a b = a*b/(gcd a b)
let rec lcm list = function
| [a;b] -> lcmSimple a b
| head::tail -> lcmSimple (head) (lcm (tail))
最好的祝福。
将函数定义为let f = function | ...
let f = function | ...
,该函数的参数是隐含的,因为它被解释为让fx = match x with | ...
fx = match x with | ...
因此, let rec lcm list = function |...
是两个变量的函数,它们是list
和隐式变量。 这就是为什么编译器声称lcm tail
是一个函数 - 只有一个变量已经通过,它期望两个。 代码的更好的版本是
let rec gcd a b =
if b = 0
then abs a
else gcd b (a % b)
let lcmSimple a b = a*b/(gcd a b)
let rec lcm = function
| [a;b] -> lcmSimple a b
| head::tail -> lcmSimple (head) (lcm (tail))
| [] -> 1
最后一个案例已包括在内以完成该模式。
链接地址: http://www.djcxy.com/p/80591.html上一篇: Recursion in F#, expected type int but got type "int list
下一篇: F#: Recursive functions: Split a list into two equal parts