递归填充字典?

时间:2011-04-02 12:35:50

标签: f# recursion dictionary types type-inference

我正在测试以下代码以递归方式填充字典。但是,类型推断似乎不能识别字典类型。我尝试过使用类型注释,但似乎没有帮助。

在递归例程中是否对字典的使用有一些限制。我是否需要使字典可变,因为我希望在迭代期间更改它。

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()

2 个答案:

答案 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
    ()