【问题标题】:Why doesn't the following recursive call work?为什么以下递归调用不起作用?
【发布时间】:2014-08-09 21:02:41
【问题描述】:

我有以下代码:

let rec nextUnusedInteger (r:Random) rangeMax used =
    let index = r.Next(0, rangeMax)
    match used |> List.tryFind (fun i -> i = index) with
    | None -> index
    | Some i -> nextUnusedInteger r rangeMax used

let rec buildRandomIntegerList (rand:Random) rangeMax reserved count acc =
    match count with
    | 0 -> acc
    | _ -> 
        let randomInteger = nextUnusedInteger rand rangeMax reserved
        let newCount = count - 1
        buildRandomIntegerList rand rangemax randomInteger::reserved newCount randomInteger::acc

我得到以下编译错误:

Type mismatch. Expecting a     'a     but given a     int -> 'a list -> 'a list
The resulting type would be infinite when unifying ''a' 
and 'int -> 'a list -> 'a list'

This value is not a function and cannot be applied

问题在于内联的缺点。 randomInteger::reserved 和 randomInteger::acc。如果我明确地为这些设置值,它就可以工作。这是修改后的代码:

let rec nextUnusedInteger rangeMax used =
    let rand = new Random()
    let index = rand.Next(0, rangeMax)
    match used |> List.tryFind (fun i -> i = index) with
    | None -> index
    | Some i -> nextUnusedInteger rangeMax used

let rec buildRandomIntegerList rangeMax reserved count acc =
    match count with
    | 0 -> acc
    | _ -> 
        let randomInteger = nextUnusedInteger rangeMax reserved
        let newCount = count - 1
        let newReserved = randomInteger::reserved
        let newAcc= randomInteger::acc
        buildRandomIntegerList rangeMax newReserved newCount newAcc

问题是为什么?我总是看到使用内联 Cons 的示例。为什么原始代码不起作用?

【问题讨论】:

    标签: f#


    【解决方案1】:

    您可以使用内联 cons,但如果结果作为函数参数传递,则需要括号:

    buildRandomIntegerList rand rangemax (randomInteger::reserved) newCount (randomInteger::acc)
    

    否则编译器会创建一个部分应用函数并尝试将某些内容连接到一个函数,这没有任何意义,这就是错误消息告诉你的内容。

    同样适用于其他运算符,函数应用优先于它们。

    【讨论】:

    • 我认为灯泡熄灭了。因此,如果我调用了函数 f,该函数需要一个列表和一个 int,并且我使用不带括号的内联 cons:f x::xs y 那么编译器会看到 f x(部分应用函数),这是它试图将 cons 转换为 xs。我暖和了吗?
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多