Recursion in F#, expected type int but got type "int list

I'm new to F# and want to implement a least common multiple function of a list by doing it recursively, eg lcm(a,b,c) = lcm(a, lcm(b,c)), where lcm of two elements is calculated from the gcd.

I have the following code. I try to match the input of the lcm function with a list of two elements, and otherwise a general list, which I split up into its first element and the remaining part. The part "lcm (tail)" gives a compiler error. It says it was expected to have type "int" but has type "int list -> int". It looks like it says that the expression "lcm tail" is itself a function, which I don't understand. Why is it not an 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))

Best regards.


When defining the function as let f = function | ... let f = function | ... , the argument to the function is implicit, as it is interpreted as let fx = match x with | ... fx = match x with | ... .

Thus let rec lcm list = function |... is a function of two variables, which are list and the implicit variable. This is why the compiler claims that lcm tail is a function - only one variable has been passed, where it expected two. A better version of the code is

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

where the last case has been included to complete the pattern.

链接地址: http://www.djcxy.com/p/80592.html

上一篇: 在F#中分割函数

下一篇: 在F#中递归,期望类型为int,但得到类型“int list”