F#中的递归,期望类型为int但得到类型" int list - > INT"

时间:2017-10-24 15:45:45

标签: recursion f# tail-recursion

我是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))

最好的问候。

1 个答案:

答案 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

其中包含最后一个案例以完成模式。