Recursion F中的递归,应为int类型,但得到类型“int list->int”

Recursion F中的递归,应为int类型,但得到类型“int list->int”,recursion,f#,tail-recursion,Recursion,F#,Tail Recursion,我不熟悉F,希望通过递归实现列表中最不常见的多重函数,例如lcma,b,c=lcma,lcmb,c,其中两个元素的lcm是从gcd计算出来的 我有以下代码。我尝试将lcm函数的输入与包含两个元素的列表相匹配,或者将其分解为第一个元素和剩余部分的常规列表相匹配。lcm tail部分给出了一个编译器错误。它说它应该有int类型,但是有int类型list->int。它看起来好像说表达式lcm tail本身就是一个函数,我不明白。为什么它不是int let rec gcd a b = if b

我不熟悉F,希望通过递归实现列表中最不常见的多重函数,例如lcma,b,c=lcma,lcmb,c,其中两个元素的lcm是从gcd计算出来的

我有以下代码。我尝试将lcm函数的输入与包含两个元素的列表相匹配,或者将其分解为第一个元素和剩余部分的常规列表相匹配。lcm tail部分给出了一个编译器错误。它说它应该有int类型,但是有int类型list->int。它看起来好像说表达式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))

致以最诚挚的问候。

将函数定义为let f=函数|…,函数的参数是隐式的,因为它被解释为let f x=将x与|

因此,让rec lcm 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

当将函数定义为let f=function |…,函数的参数是隐式的,因为它被解释为let f x=match x with |

因此,让rec lcm 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

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

也许,您的意思是让rec lcm=function但仍然注意警告-您不会处理所有可能的案例。@FoggyFinder您是对的,如果我删除列表,它会起作用,但通常您会在函数中包含一个参数。我意识到我从不使用列表,也许它是一个匹配的东西。另外,我还包括了空的case.let rec lcm list=function |。。。是let rec lcm list x=将x与|匹配的缩写。。。所以你的函数需要2个参数,而不是1个。所以,必须有人写出答案@您想怎么做?也许,您的意思是让rec lcm=function,但仍然注意警告-您不会处理所有可能的情况。@FoggyFinder您是对的,如果我删除列表,它会工作,但通常您会在函数中包含一个参数。我意识到我从不使用列表,也许它是一个匹配的东西。另外,我还包括了空的case.let rec lcm list=function |。。。是let rec lcm list x=将x与|匹配的缩写。。。所以你的函数需要2个参数,而不是1个。所以,必须有人写出答案@你想怎么做?