【发布时间】:2013-12-30 02:56:53
【问题描述】:
我有一个递归函数,可以像这样创建一棵树:
let rec evaluate node =
let neighbors = getNeighbors node
let visited = [for x, y in neighbors do
if not tiles.[y].[x] then
tiles.[y].[x] <- true
evaluate (x, y)]
if List.length visited > 0 then
Node(x, y, visited)
else
Leaf(x, y)
Node 和 Leaf 来自这个定义:
type Tree =
| Leaf of int * int
| Node of int * int * Tree list
而tiles 是一个二维布尔数组,表示已访问了哪些图块(我正在实现迷宫生成)。
现在上面的函数不能编译。推断的类型是int*int -> unit,应该是int*int -> Tree。
我试图强制返回类型为Tree,但随后编译器抱怨调用评估的类型应为unit,但类型为Tree。
我找到了一种使用序列表达式并转换为列表的解决方法:
let visited = Seq.toList (seq {
for x, y in neighbors do
if not tiles.[y].[x] then
tiles.[y].[x] <- true
yield evaluate (x, y)})
但我不明白为什么使用列表表达式不起作用。
【问题讨论】:
标签: f#