取本实施例的代码(忽略它是暂时效率极其低下)

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

其他提示

请注意,虽然你说你使用的功能只有一次,在技术上你是指它的名字两次,这就是为什么它是有道理的,给它一个名字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top