gpt4 book ai didi

recursion - F#中的递归lambda

转载 作者:行者123 更新时间:2023-12-04 09:57:09 25 4
gpt4 key购买 nike

请看下面的示例代码(暂时忽略它的效率极低)

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

let rec inner (lst:list<'a>) buffer = ;;' prettify fix
match List.length lst with
| 0 -> buffer
| _ -> inner (List.tl lst) (buffer + ((List.hd lst).ToString()))

inner 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 ""

但是正如您可能期望的那样,没有办法在其内部引用匿名函数,这在我将## RECURSE ##放入其中时是必需的。

最佳答案

是的,可以使用所谓的y-combinators(或fixed-point combinators)。前任:

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" *)

我不了解F#的文章,但此 haskell entry可能也有帮助。

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

您的代码(此处省略类型注释)是一种标准结构,更具表现力。
let listToString lst =

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

loop "" lst

关于recursion - F#中的递归lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/902243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com