在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