我正在测试以下代码以递归方式填充字典。但是,类型推断似乎不能识别字典类型。我尝试过使用类型注释,但似乎没有帮助。
在递归例程中是否对字典的使用有一些限制。我是否需要使字典可变,因为我希望在迭代期间更改它。
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()
答案 0 :(得分:4)
首先,你的类型不匹配。
您正尝试将int list
(这是acc
)添加到应该包含int
s的字典中。
然而,除此之外,编译器无法推断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>) =
但是,您仍然遇到字典上不匹配类型的问题,因此如果您打算在其中存储Dictionary<string, int list>
,则可能希望它为int list
。
答案 1 :(得分:1)
是你想要的吗?
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
()