2011-04-02 20 views
1

我测试以下代码递归地填充字典。然而,类型推断似乎不能识别字典类型。我试过使用类型注释,但似乎没有帮助。递归填充字典?

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

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

你想要一个带有一个键(“dummykey”)的可变字典,它包含你传入的列表? let dic = Dictionary (); dic.add(“dummykey”,[1,2,3,4]) – 2011-04-02 22:08:18

回答

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当它编译功能,就是它有一个名为Addstring * 'a list -> ?的方法。

要修复它,改变

let rec inner tlist acc ddict = 

let rec inner tlist acc (ddict:Dictionary<string,int>) = 

你仍然有在字典中的不匹配类型的麻烦,然而,你可能希望它是Dictionary<string, int list>,如果你计划在其中存储int list

+0

好的解释 - 获取/检查类型检查规则很明确可能是学习F#中最棘手的部分 - 但它确实关注头脑和(希望)提高我们的编码技能。 – BrendanC 2011-04-02 13:14:02

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