Dictionary 在SML中创建词典

Dictionary 在SML中创建词典,dictionary,sml,smlnj,metalanguage,Dictionary,Sml,Smlnj,Metalanguage,我是SML语言的新学习者。我已经学习了SML语言的基础知识。但是,我在获取用SML创建词典的代码方面遇到了麻烦。因此,我想知道代码。您可以从为字典定义签名开始: signaturedict= 信号 类型(“k,”,v)dict val empty:(“k,”,v)dict val插入:“k->”v->(“k,”,v)dict->(“k,”,v)dict val查找:''k->(''k',v)dict->'v选项 结束 'k(相等类型)假定我需要知道的关于键值存储的键的唯一一件事是,可以比较它是

我是SML语言的新学习者。我已经学习了SML语言的基础知识。但是,我在获取用SML创建词典的代码方面遇到了麻烦。因此,我想知道代码。

您可以从为字典定义签名开始:

signaturedict=
信号
类型(“k,”,v)dict
val empty:(“k,”,v)dict
val插入:“k->”v->(“k,”,v)dict->(“k,”,v)dict
val查找:''k->(''k',v)dict->'v选项
结束
'k
(相等类型)假定我需要知道的关于键值存储的键的唯一一件事是,可以比较它是否相等,以便在查找时找到正确的键。这使我能够使用O(n)插入和查找构建一个简单的基于列表的字典:

结构列表DICT:DICT=
结构
类型('k',v)dict=('k*'v)列表
val empty=[]
有趣的插入kv[]=[(k,v)]
|插入k v((k2,v2)::剩余)=
如果k=k2,那么(k,v)::rest-else(k2,v2)::插入k-v-rest
有趣的查找k[]=无
|查找k((k2,v)::剩余)=
如果k=k2,则某个v剩余k
结束
例如,
“k
的类型级别限制意味着我不能将我的字典表示为二元搜索树,因为排序(小于、等于、大于)不是相等类型的属性,或者将我的字典表示为哈希表,因为查找值的哈希也不是相等类型的属性

因此,我可能希望密钥可以排序或散列。不幸的是,SML没有一个内置的类,它的类型是可排序的或可散列的,就像它有相等类型一样。克服此限制的一种方法是更改接口,以便将比较或哈希函数传递给模块。下面是如何进行比较的:

ORD签名=
信号
t型
val比较:t->t->order
结束
签名口述=
信号
k型
v型dict
val空:“v dict
val插入:k->'v->'v dict->'v dict
val查找:k->'v dict->'v选项
结束
例如,这允许我编写基于二叉树的字典结构:

函子树指令(Ord:Ord):指令= 结构 k型=Ord.t 数据类型'v dict=k*'v*'v dict*'v dict的叶节点 val empty=Leaf 趣味插入k v叶=节点(k,v,叶,叶) |插入k v(节点(k2、v2、左、右))= 案例Ord.比较(k,k2) EQ=>节点(k、v、左、右) |LT=>节点(k2,v2,插入k v左,右) |GT=>节点(k2,v2,左,插入k v右) k叶=无 |查找k(节点(k2、v、左、右))= 案例Ord.比较(k,k2) EQ=>一些v |GT=>k右查找 |LT=>k左 结束 缺点是我必须明确我想要什么

例如,键为
int
的基于树的词典可以这样制作:

structure IntTreeDict=TreeDict(
结构
类型t=int
val compare=Int.compare
(完)

Yatendra的可能重复:我建议您查看snieguu链接到的问答,因为它或多或少包含您的问题,除非代码反映了您的提问尝试。通常情况下,在提问之前进行尝试是首选的,同时也要寻找以前就同一主题提出的问题。(这通常可以通过谷歌来完成。)你可以用多种方式编写这样的东西——没有“the”代码。做什么在很大程度上取决于你目前所学的东西。