我是F#的新手,希望通过递归方式实现列表中最不常见的多重函数,例如: lcm(a,b,c)= lcm(a,lcm(b,c)),其中lcm的两个元素是从gcd计算的。
我有以下代码。我尝试将lcm函数的输入与两个元素的列表进行匹配,否则将是一个通用列表,我将其拆分为第一个元素和剩余部分。部分" lcm(尾部)"给出编译器错误。它说它有类型" int"但是有类型" int list - > INT&#34 ;.它看起来像是表达" lcm tail"本身就是一个功能,我不明白。为什么不是int?
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))
最好的问候。
答案 0 :(得分:6)
将函数定义为let f = function | ...
时,函数的参数是隐式的,因为它被解释为let f x = 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
其中包含最后一个案例以完成模式。