F# 递归地填充字典?

F# 递归地填充字典?,f#,recursion,dictionary,types,type-inference,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<stri

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

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

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()
开放系统
open System.Collections.Generic
////字典递归测试
让pop_dict tlist=
//let rec inner tlist acc ddict:字典=
让rec INTERNAL tlist acc ddict=
匹配列表
|[]->ddict.Add(“dummykey”,acc)
|x::xs->内部xs(x::acc)DDCT
设ddict=Dictionary()
内部tlist[]ddict
//主要入口点
让main()=
设tlist=[1;2;3;4]
设d=pop_dict tlist
main()

这就是你想要的吗

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
    ()
let pop_dict tlist=
let rec内部tlist acc(目录:字典)=
匹配列表
|[]->ddict.Add(“dummykey”,acc)
|x::xs->内部xs(x::acc)DDCT
设ddict=Dictionary()
内部tlist[]ddict
//主要入口点
让main()=
设tlist=[1;2;3;4]
设d=pop_dict tlist
()

这就是你想要的吗

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
    ()
let pop_dict tlist=
let rec内部tlist acc(目录:字典)=
匹配列表
|[]->ddict.Add(“dummykey”,acc)
|x::xs->内部xs(x::acc)DDCT
设ddict=Dictionary()
内部tlist[]ddict
//主要入口点
让main()=
设tlist=[1;2;3;4]
设d=pop_dict tlist
()

首先,您的类型不匹配

您正试图将
int列表
(即
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*'一个列表->?

要解决它,就要改变

let rec inner tlist acc ddict =

let rec inner tlist acc(ddict:Dictionary)=

但是,如果您计划在字典中存储
int list
s,那么字典中不匹配的类型仍然存在问题,因此您可能希望它是
dictionary

首先,您的类型不匹配

您正试图将
int列表
(即
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*'一个列表->?

要解决它,就要改变

let rec inner tlist acc ddict =

let rec inner tlist acc(ddict:Dictionary)=

但是,如果你打算在字典中存储
int-list
s,你仍然会遇到字典中不匹配类型的问题,因此你可能希望它是
字典。

很好的解释-弄清楚/检查类型检查规则可能是学习F#最棘手的部分-但是它确实会集中精力和精力(希望)提高了我们的编码技能。很好的解释-弄清楚/检查类型检查规则可能是学习F#最棘手的部分-但是它确实能集中注意力并(希望)提高我们的编码技能。你想要一个包含你传入的列表的一个键(“dummykey”)的可变字典吗?让dic=dictionary();dic.add(“dummykey”,[1,2,3,4])您想要一个带有一个键(“dummykey”)的可变字典,其中包含您传入的列表?让dic=dictionary();dic.add(“dummykey”,[1,2,3,4])