F# 为什么';下面的递归调用不起作用吗?
我有以下代码:F# 为什么';下面的递归调用不起作用吗?,f#,F#,我有以下代码: 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 build
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
问题是内联的Cons。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的示例。为什么原始代码不能工作?您可以使用内联cons,但如果结果作为函数参数传递,则需要括号:
buildRandomIntegerList rand rangemax (randomInteger::reserved) newCount (randomInteger::acc)
否则,编译器将创建一个部分应用函数,并尝试将某些内容连接到函数,这毫无意义,错误消息就是这样告诉您的
这同样适用于其他运算符,函数应用程序的优先级高于它们。您可以使用内联cons,但如果结果作为函数参数传递,则需要括号:
buildRandomIntegerList rand rangemax (randomInteger::reserved) newCount (randomInteger::acc)
否则,编译器将创建一个部分应用函数,并尝试将某些内容连接到函数,这毫无意义,错误消息就是这样告诉您的
这同样适用于其他运算符,函数应用程序的优先级高于它们。您可以使用内联cons,但如果结果作为函数参数传递,则需要括号:
buildRandomIntegerList rand rangemax (randomInteger::reserved) newCount (randomInteger::acc)
否则,编译器将创建一个部分应用函数,并尝试将某些内容连接到函数,这毫无意义,错误消息就是这样告诉您的
这同样适用于其他运算符,函数应用程序的优先级高于它们。您可以使用内联cons,但如果结果作为函数参数传递,则需要括号:
buildRandomIntegerList rand rangemax (randomInteger::reserved) newCount (randomInteger::acc)
否则,编译器将创建一个部分应用函数,并尝试将某些内容连接到函数,这毫无意义,错误消息就是这样告诉您的
这同样适用于其他操作员,功能应用程序优先于他们。我想灯泡要熄灭了。因此,如果我对函数f进行调用,调用的是一个列表和一个int,并且我使用内联cons,而不使用parens:fx::xsy,那么编译器会看到fx(部分应用的函数),它正试图cons到xs。我暖和了吗?我想灯泡要灭了。因此,如果我对函数f进行调用,调用的是一个列表和一个int,并且我使用内联cons,而不使用parens:fx::xsy,那么编译器会看到fx(部分应用的函数),它正试图cons到xs。我暖和了吗?我想灯泡要灭了。因此,如果我对函数f进行调用,调用的是一个列表和一个int,并且我使用内联cons,而不使用parens:fx::xsy,那么编译器会看到fx(部分应用的函数),它正试图cons到xs。我暖和了吗?我想灯泡要灭了。因此,如果我对函数f进行调用,调用的是一个列表和一个int,并且我使用内联cons,而不使用parens:fx::xsy,那么编译器会看到fx(部分应用的函数),它正试图cons到xs。我暖和了吗?