Recursion F中的递归lambdas#

Recursion F中的递归lambdas#,recursion,lambda,functional-programming,f#,fixpoint-combinators,Recursion,Lambda,Functional Programming,F#,Fixpoint Combinators,以这个示例代码为例(暂时忽略它,因为它效率极低) 让listToString(lst:list缓冲区 |>内部(List.tl lst)(缓冲区+((List.hd lst.ToString()) 内部lst“” 这是我在F#中经常遇到的一种常见模式,我需要一个内部函数,它在某个值上递归自己-我只需要这个函数一次,有没有可能从它自身内部调用lambda(一些神奇的关键字或其他东西)?我希望代码看起来像这样: let listToString2 (lst:list<'a>) = ;;

以这个示例代码为例(暂时忽略它,因为它效率极低)

让listToString(lst:list缓冲区
|>内部(List.tl lst)(缓冲区+((List.hd lst.ToString())
内部lst“”
这是我在F#中经常遇到的一种常见模式,我需要一个内部函数,它在某个值上递归自己-我只需要这个函数一次,有没有可能从它自身内部调用lambda(一些神奇的关键字或其他东西)?我希望代码看起来像这样:

let listToString2 (lst:list<'a>) = ;;' prettify fix

    ( fun 
        (lst:list<'a>) buffer -> match List.length lst with ;;' prettify fix
                                 | 0 -> buffer
                                 | _ -> ##RECURSE## (List.tl lst) (buffer + ((List.hd lst).ToString())) 
    ) lst "" 
let listToString2(lst:list缓冲区
|递归(List.tl lst)(buffer+((List.hd lst.ToString()))
)lst“

但是,正如您可能期望的那样,没有办法在其内部引用匿名函数,这是在我放置#######

的地方所需要的。是的,可以使用所谓的(或
定点组合符
)进行引用。例如:

我不知道F#的文章,但这可能也有帮助

但是:如果有其他选择,我不会使用它们——它们很难理解

您的代码(省略这里的类型注释)是一个标准的构造,更具表现力

let listToString lst =

    let rec loop acc = function
        | []    -> acc
        | x::xs -> loop (acc ^ (string x)) xs

    loop "" lst

请注意,尽管您说您只使用了一次函数,但从技术上讲,您会两次按名称引用它,这就是为什么给它命名是有意义的

let rec fix f x = f (fix f) x

let fact f = function
 | 0 -> 1
 | x -> x * f (x-1)


let _ = (fix fact) 5 (* evaluates to "120" *)
let listToString lst =

    let rec loop acc = function
        | []    -> acc
        | x::xs -> loop (acc ^ (string x)) xs

    loop "" lst