在F#递归lambda表达式
-
05-09-2019 - |
题
取本实施例的代码(忽略它是暂时效率极其低下)
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#跨越未来一个共同的模式,我需要有一个内部函数谁递归本身在一定的价值 - 我只需要这个功能曾经,有没有以任何可能的方式从内部调用它拉姆达自(一些神奇的关键字或东西)?我想代码看起来是这样的:
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组合子(或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#的文章,但这篇哈斯克尔进入或许也有帮助
不过:如果有任何替代方案,我不会使用他们 - 他们会很难理解
您的代码(省略这里的类型注释)是一个标准的构建体和更富于表现力。
let listToString lst =
let rec loop acc = function
| [] -> acc
| x::xs -> loop (acc ^ (string x)) xs
loop "" lst
其他提示
请注意,虽然你说你使用的功能只有一次,在技术上你是指它的名字两次,这就是为什么它是有道理的,给它一个名字。
不隶属于 StackOverflow