【发布时间】: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#