我正在测试以下代码,以递归方式填充字典。但是,类型推断似乎无法识别字典类型。我尝试过使用类型注释,但似乎没有什么帮助。
在递归例程中使用字典有什么限制吗?我是否需要使字典可变,因为我希望在迭代期间更改它。
open System
open System.Collections.Generic
////dictionary recursion test
let pop_dict tlist =
// let rec inner tlist acc ddict:Dictionary<string,int> =
let rec inner tlist acc ddict =
match tlist with
| [] -> ddict.Add ("dummykey", acc)
| x::xs -> inner xs (x::acc) ddict
let ddict = Dictionary<string,int>()
inner tlist [] ddict
// Main Entry Point
let main() =
let tlist = [1;2;3;4]
let d = pop_dict tlist
main()发布于 2011-04-02 20:50:29
首先,你们的类型不匹配。
您正在尝试将一个int list (这就是acc )添加到应该包含ints的字典中。
然而,除此之外,编译器无法推断ddict类型的原因是。请记住,当类型检查器确定函数的类型时,它不会查看以后调用的内容。它只有以下信息可用:
let rec inner tlist acc ddict =
match tlist with
| [] -> ddict.Add ("dummykey", acc)
| x::xs -> inner xs (x::acc) ddict这意味着,当它编译函数时,它所知道的关于ddict的唯一信息是它有一个名为Add的方法,这个方法是string * 'a list -> ?。
要修复它,请更改
let rec inner tlist acc ddict =至
let rec inner tlist acc (ddict:Dictionary<string,int>) =但是,字典上的不匹配类型仍然存在问题,所以如果您计划在字典中存储int list,那么您可能希望它是Dictionary<string, int list>。
发布于 2011-04-02 20:48:20
这是你想要的吗?
let pop_dict tlist =
let rec inner tlist acc (ddict:Dictionary<string,int list>) =
match tlist with
| [] -> ddict.Add ("dummykey", acc)
| x::xs -> inner xs (x::acc) ddict
let ddict = Dictionary<string,int list>()
inner tlist [] ddict
// Main Entry Point
let main() =
let tlist = [1;2;3;4]
let d = pop_dict tlist
()https://stackoverflow.com/questions/5523183
复制相似问题